gpt4 book ai didi

c++ - 警告 C4244 : 'argument' : conversion from 'SIZE_T' to 'DWORD' , 可能丢失数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:09 25 4
gpt4 key购买 nike

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

#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 保证为无符号整数类型,但未指定其位数。它可以等于 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,因为这会通过使用变量名。

关于c++ - 警告 C4244 : 'argument' : conversion from 'SIZE_T' to 'DWORD' , 可能丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/290699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com