Compilerwarnung (Stufe 3) C4267
Aktualisiert: November 2007
Fehlermeldung
'var': Konvertierung von 'size_t' zu 'Typ', möglicher Datenverlust
'var' : conversion from 'size_t' to 'type', possible loss of data
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
}