Freigeben über


Compilerwarnung (Stufe 3) C4267

'var': Konvertierung von 'size_t' zu 'Typ', möglicher Datenverlust

Beim Kompilieren mit /Wp64 oder beim Kompilieren unter einem 64-Bit-Betriebssystem hat type 32 Bits, size_t dagegen 64 Bits, wenn für 64-Bit-Ziele kompiliert wird.

Um diese Warnung zu vermeiden, verwenden Sie size_tanstelle von type.

Beispiel

Im folgenden Beispiel wird C4267 generiert.

// 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 kann auch auf x86 auftreten. Diese Warnung kann nicht durch Code vermieden werden, lässt sich jedoch mit dem warning-Pragma ignorieren und unterdrücken.

Dabei wird C4267 durch eine Einschränkung in den /Wp64-Warnungen verursacht. Auf x86 wird std::cout<<range_index zu einer Überladung von operator<< aufgelöst, der einen unsigned int akzeptiert, da size_t in Win32 ein unsigned int ist. C4267 tritt auf, weil Sie einen size_t als unsigned int-Argument übergeben haben. Dies würde auf Win64 eine Verkürzung verursachen, bei der size_t eine Größe von 64 Bits, unsigned int jedoch weiterhin eine Größe von 32 Bits hat. Dies kann ignoriert werden, da Sie für Win64 kompiliert haben. std::cout<<range_index würde zu einer Überladung von operator<< aufgelöst, der einen unsigned __int64 akzeptiert, da dies auf Win64 der Typ size_t ist. Da dies vom 32-Bit-Compiler nicht beachtet wird, erfolgt eine Warnung.

Im folgenden Beispiel wird C4267 generiert.

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