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
}