共用方式為


編譯器警告 (層級 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
}

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
}