编译器警告(等级 3)C4267

更新:2007 年 11 月

错误消息

“var”: 从“size_t”到“type”的转换可能丢失数据

如果使用 /Wp64 进行编译,或者在 64 位操作系统上编译,则在为 64 位目标程序编译时,type 为 32 位而 size_t 为 64 位。

要修复此警告,请使用 size_t而不是 type

示例

下面的示例生成 C4267。

// C4267.cpp
// compile with: /W3 /Wp64
#include <Windows.h>
void Func(int i) {}
void Func2(DWORD i) {}
void Func3(size_t i) {}

int main() {
   size_t bufferSize = 10;
   Func(bufferSize);   // C4267
   Func2(bufferSize);   // C4267
   Func3(bufferSize);   // OK
}

在 x86 上也会发生 C4267,此警告无法在代码中解决,但可以使用 warning 杂注予以忽略和取消。

在这种情况下,C4267 是由 /Wp64 警告中的限制引起的。在 x86 上,因为 size_t 是 Win32 上的 unsigned int,因此 std::cout<<range_index 解析为接受 unsigned int 的 operator<< 的重载。发生 C4267 的原因是将 size_t 作为 unsigned int 参数传递,这会导致 Win64 上的截断,在 Win64 中,size_t 为 64 位,而 unsigned int 仍为 32 位。可以忽略此警告,原因如下:如果在 Win64 中进行编译,std::cout<<range_index 将解析为接受 unsigned __int64 的 operator<< 的重载,因为类型 size_t 在 Win64 上就是该类型。32 位编译器未注意到这一点,因此会发出警告。

下面的示例生成 C4267。

// C4267_b.cpp
// compile with: /W3 /Wp64 /EHsc
// processor: x86
#include <fstream>
#include <vector>
using namespace std;

int main() {
   ofstream outputfile;
   vector<char> vecbuffer(10);
   outputfile.write( &vecbuffer[0], vecbuffer.size() );   // C4267
}