Aracılığıyla paylaş


Derleyici uyarı (Düzey 3) C4267

'var': 'yazmak için ' olası veri kaybını 'size_t' dönüştürme

İle derlerken /Wp64, ya da 64-bit işletim sisteminde derlerken türü 32 bittir, ancak size_t 64-bit hedefler için derleme sırasında 64 bittir.

Bu uyarıyı gidermek için size_tyerine bir türü.

Örnek

Aşağıdaki örnek C4267 oluşturur.

// 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 de neden olabilir x 86 ve bu uyarıyı olamaz kodda çözümlenmesi ancak göz ardı ve olması ile bastırılmış warning pragma.

Bu durumda bir sınırlama C4267 neden /Wp64 uyarılar.X 86 std::cout<<range_index aşırı yüklenmesini için çözümler operator<< kabul eden bir unsigned int, çünkü size_t olan bir unsigned int Win32 üzerinde.C4267, geçirilen nedeniyle oluşur bir size_t olarak bir unsigned int kesilme Win64 üzerinde neden bağımsız nerede size_t 64-bit, ancak unsigned int yine de 32-bit.Bunun nedeni sayılabilir Win64 için derlendiğinde if std::cout<<range_index için aşırı yüklenmesini çözmek operator<< kabul eden bir unsigned __int64, ne tür olduğundan, size_t Win64 üzerinde olduğu.Onu uyarır şekilde 32-bit derleyici fark etmez.

Aşağıdaki örnek C4267 oluşturur.

// 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
}