我需要在我的代码中有一组重载函数,但我得到了转换.这是一个测试代码:
#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
如何避免出现此警告或错误?
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
,因为这会通过使用变量名称遮蔽类型名称来引入混淆.