Compartir a través de


Advertencia del compilador (nivel 3) C4267

'var': conversión de 'size_t' a 'tipo', posible pérdida de datos

Cuando se compila con /Wp64, o cuando se compila en un sistema operativo de 64 bits, el tipo es de 32 bits, pero size_t es de 64 bits cuando se compila para destinos de 64 bits.

Para corregir esta advertencia, utilice size_ten lugar de un tipo.

Ejemplo

El ejemplo siguiente genera el error 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
}

La advertencia C4267 también puede aparecer en x86 y no se puede resolver en código, pero se puede omitir y suprimir con el pragma warning.

En esta situación, la advertencia C4267 está provocada por una limitación en las advertencias de /Wp64. En x86, std::cout<<range_index se resuelve como la sobrecarga de operator<< que acepta un unsigned int, ya que size_t es un unsigned int en Win32. La advertencia C4267 se produce porque se ha pasado un valor size_t como argumento unsigned int, lo que puede provocar truncamiento en Win64, donde size_t es de 64 bits, pero unsigned int sigue siendo de 32 bits. En este caso, se puede omitir, porque si se ha compilado para Win64, std::cout<<range_index se resolverá como la sobrecarga de operator<< que acepta un unsigned __int64, ya que eso es lo que es el tipo size_t en Win64. El compilador de 32 bits no lo percibe, y por eso advierte.

El ejemplo siguiente genera el error 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
}