Sdílet prostřednictvím


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
}