我需要在我的代码中有一组重载函数,但我得到了转换。 这是一个测试代码:
#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
如何避免出现此警告或错误?
答案 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个字节
typedef ULONG_PTR SIZE_T;
#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;
#endif