C4267 (úroveň 3) upozornění kompilátoru
"var": převod z 'size_t' typ, možné ztrátě dat.
Při kompilaci s /Wp64, nebo při kompilaci na 64bitový operační systém, typu je 32 bitů, ale size_t při kompilaci pro 64bitové cíle je 64 bitů.
Toto upozornění můžete vyřešit pomocí size_tmísto typu.
Příklad
Následující ukázka generuje 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 může být také způsoben x 86 a toto upozornění nelze vyřešit v kódu, ale mohou být ignorovány a s potlačenými warning pragma.
V této situaci C4267 způsobené omezení v /Wp64 upozornění.X 86 std::cout<<range_index překládá přetížení z operator<< , přijímá unsigned int, od size_t je unsigned int v systému Win32.Předaný dochází k C4267 size_t jako unsigned int argument, který by způsobila zkrácení v architektuře Win64 kde size_t je 64 bitů, ale unsigned int je stále 32bitové.To může být ignorována, protože pokud sestavit pro Win64, std::cout<<range_index vyřešit k přetížení z operator<< , přijímá unsigned __int64, protože je typu size_t je v architektuře Win64.32Bitový kompilátor nemá si tak budete upozorněni.
Následující ukázka generuje 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
}