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

时间:2008-11-14 16:42:53

标签: c++ compiler-construction types warnings

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

#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

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

3 个答案:

答案 0 :(得分:13)

size_t保证是无符号整数类型,但未指定它的位数。它可以等于DWORD(32位),或者在64位平台上可以是64位。为了获得最大的可移植性,您不应该假设它具有一定数量的位,这是编译器警告您的内容。如果您知道您的值永远不会超过2 ^ 32(99.99%的情况下这是一个合理的假设),那么您可以转换为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是非标准的,几乎肯定是size_t的typedef或#define。您应该使用size_t而不是SIZE_T,并且还应该避免命名变量size_t,因为这会通过使用变量名称隐藏类型名称来引入混淆。

答案 1 :(得分:0)

最简单的答案是摆脱f(DWORD)并重新定义f(size_t)。当然,除非f()size_t s以外的值进行操作。

答案 2 :(得分:-1)

SIZE_T在64位系统中占用8个字节,而DWORD占用4个字节

来自Windows Data Types

typedef ULONG_PTR SIZE_T;

#if defined(_WIN64)
 typedef unsigned __int64 ULONG_PTR;
#else
 typedef unsigned long ULONG_PTR;
#endif