4 c++ compiler-construction warnings types
我需要在我的代码中有一组重载函数,但我得到了转换.这是一个测试代码:
#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
如何避免出现此警告或错误?
Ada*_*eld 13
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,因为这会通过使用变量名称遮蔽类型名称来引入混淆.
| 归档时间: | 
 | 
| 查看次数: | 13373 次 | 
| 最近记录: |