編譯器警告 (層級 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
}
C4267 也可能發生在 x86 上,而這項警告無法在程式碼中解決,但是可加以忽略並且使用 warning pragma 加以抑制。
在這種情況下,C4267 會因 /Wp64 警告中的限制而造成。在 x86 上,std::cout<<range_index 會解析至接受 unsigned int 之 operator<< 的多載,因為 size_t 在 Win32 上為 unsigned int。C4267 發生是因為您傳遞 size_t 做為 unsigned int 引數,它會在 Win64 上造成截斷,其中 size_t 是 64 位元,但 unsigned int 還是 32 位元。這種情形可加以忽略,因為如果您為 Win64 編譯,std::cout<<range_index 會解析至接受 unsigned __int64 之 operator<< 的多載,因為在 Win64 上型別 size_t 就是這個。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
}