컴파일러 경고(수준 3) C4267

'var' : 'size_t'에서 'type'(으)로 변환하면서 데이터가 손실될 수 있습니다.

/Wp64를 사용하여 컴파일하거나 64비트 운영 체제에서 컴파일하는 경우, 64비트 대상에 대한 컴파일 시 type은 32비트이지만 size_t는 64비트입니다.

이 경고를 해결하려면 type 대신 size_t를 사용합니다.

예제

다음 샘플에서는 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은 x86에서도 발생할 수 있습니다. 코드에서 이 경고를 해결할 수는 없지만 warning pragma를 사용하여 이 경고를 무시하고 표시하지 않을 수는 있습니다.

이 경우 C4267은 /Wp64 경고의 제한으로 발생합니다. x86에서 std::cout<<range_index는 unsigned int를 허용하는 **operator<<**의 오버로드를 확인합니다. Win32에서 size_t는 unsigned int이기 때문입니다. C4267은 size_t를 unsigned int 인수로 전달한 경우에 발생합니다. 이 경우 size_t가 64비트인 Win64에서 잘림이 발생하지만 unsigned int는 32비트를 유지합니다. Win64에 대해 컴파일한 경우 std::cout<<range_index는 unsigned __int64를 허용하는 **operator<<**의 오버로드를 확인하므로 이를 무시할 수 있습니다. 이는 바로 Win64에서 size_t 형식이기 때문입니다. 32비트 컴파일러는 여기에 해당하지 않으므로 경고가 발생합니다.

다음 샘플에서는 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
}