4

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

#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

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

4

3 回答 3

15

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

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 for size_t. 您应该使用size_tinstead of SIZE_T,并且您还应该避免命名您的 variables size_t,因为这会通过使用变量名称来隐藏类型名称来引入混淆。

于 2008-11-14T16:49:32.343 回答
0

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

于 2008-11-15T00:52:25.753 回答
-2

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

Windows 数据类型

typedef ULONG_PTR SIZE_T;

#if defined(_WIN64)
 typedef unsigned __int64 ULONG_PTR;
#else
 typedef unsigned long ULONG_PTR;
#endif
于 2016-05-05T12:02:10.150 回答