Condividi tramite


Avviso del compilatore (livello 3) C4267

Aggiornamento: novembre 2007

Messaggio di errore

'var': conversione da 'size_t' a 'tipo'. Possibile perdita di dati
'var' : conversion from 'size_t' to 'type', possible loss of data

Quando si esegue la compilazione con /Wp64 o su un sistema operativo a 64 bit, tipo è a 32 bit, mentre quando si esegue la compilazione per destinazioni a 64 bit size_t è a 64 bit.

Per non visualizzare questo avviso, utilizzare size_tanziché tipo.

Esempio

Nell'esempio seguente viene generato l'errore 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
}

L'avviso C4267 può essere visualizzato anche su piattaforme x86. Il problema non può essere risolto nel codice, ma può essere ignorato ed eliminato con il pragma warning.

In questo caso, l'avviso C4267 è stato generato a causa di un limite definito per gli avvisi /Wp64. Su piattaforme x86 std::cout<<range_index viene risolto nell'overload di operator<< che accetta un valore unsigned int, poiché size_t è un valore unsigned int su Win32. L'avviso C4267 viene visualizzato perché è stato passato size_t come argomento unsigned int. Questo determina un troncamento su Win64, dove size_t è a 64 bit mentre unsigned int è a 32 bit. Questa situazione può essere ignorata poiché, se si esegue la compilazione per Win64, std::cout<<range_index viene risolto nell'overload di operator<<, che accetta un valore unsigned __int64, esattamente il tipo size_t su Win64. Il compilatore a 32 bit non lo rileva e genera l'avviso.

Nell'esempio seguente viene generato l'errore 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
}