Udostępnij za pośrednictwem


Kompilator ostrzeżenia (poziom 3) C4267

'var': konwersja z "int", "type", możliwej utracie danych

Podczas kompilowania z /Wp64, lub na 64-bitowym systemie operacyjnym, przygotowując typu 32 bity, ale int jest 64 bitów podczas kompilacji dla celów 64-bitowych.

Aby naprawić tego ostrzeżenia, należy użyć size_tzamiast typu.

Przykład

Poniższy przykład 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 może być również spowodowane na procesorach x 86, i to ostrzeżenie nie można rozpoznać w kodzie, ale może być ignorowane i pominięte z warning pragma.

W tej sytuacji C4267 jest spowodowane ograniczenia w /Wp64 ostrzeżenia.W architekturze x 86 std::cout<<range_index rozpoznawany jako przeciążenie z operator<< akceptującym unsigned int, ponieważ size_t jest unsigned int na Win32.C4267 występuje, ponieważ przekazana została size_t jako unsigned int argumentów, które mogłyby spowodować obcięcie na Win64 gdzie size_t jest 64-bitowych, ale unsigned int jest nadal 32-bitowych.Może to być zignorowane, ponieważ jeśli sporządzanych dla Win64, std::cout<<range_index rozwiąże do przeciążenia, z operator<< akceptującym unsigned __int64, ponieważ jest typ size_t znajduje się na Win64.32-Bitowy kompilator nie zauważyć tak ostrzega użytkownika.

Poniższy przykład 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
}