当前位置:  开发笔记 > 编程语言 > 正文

警告C4244:'参数':从'SIZE_T'转换为'DWORD',可能会丢失数据

如何解决《警告C4244:'参数':从'SIZE_T'转换为'DWORD',可能会丢失数据》经验,为你挑选了1个好方法。

我需要在我的代码中有一组重载函数,但我得到了转换.这是一个测试代码:

#include windows.h

void f(DWORD arg){...}

//void f(SIZE_T arg){}

void main(void)
{
DWORD dword=0;
SIZE_T size_t=dword;
f(size_t);

}

编译器发出警告:

test.cpp(11) : warning C4244: 'argument' : conversion from 'SIZE_T' to 'DWORD', possible loss of data

如果我取消注释void f(SIZE_T arg)我得到

test.cpp(5) : error C2084: function 'void f(DWORD)' already has a body

如何避免出现此警告或错误?



1> Adam Rosenfi..:

size_t保证是无符号整数类型,但未指定它的位数.它可以等于a DWORD(32位),也可以是64位平台上的64位.为了获得最大的可移植性,您不应该假设它具有一定数量的位,这是编译器警告您的内容.如果你知道你的价值永远不会超过2 ^ 32(在99.99%的情况下这是一个合理的假设),那么你可以转换为a DWORD来摆脱警告:

SIZE_T sz = dword;
f((DWORD)sz);  // no warning here

你得到的错误是因为在你的情况下,size_t实际上是32位,所以你的两个f函数的函数签名是相同的 - 它们都采用一个无符号的32位参数.您必须为它们使用单​​独的名称,以确保您的程序可在32位和64位平台之间移植:

void f_DWORD(DWORD arg) { ... }
void f_size_t(size_t arg) { ... }

最后一点:size_t内置类型. SIZE_T是非标准的,几乎肯定是typedef或#define size_t.您应该使用size_t而不是SIZE_T,并且还应该避免命名变量size_t,因为这会通过使用变量名称遮蔽类型名称来引入混淆.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有