编译器警告(等级 3)C4267
“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
}