Avertissement du compilateur (niveau 3) C4267
Mise à jour : novembre 2007
Message d'erreur
'var' : conversion de 'size_t' en 'type', perte possible de données
'var' : conversion from 'size_t' to 'type', possible loss of data
Lors de la compilation avec /Wp64 ou de la compilation sur un système d'exploitation 64 bits, type a la valeur 32 bits, mais size_t a la valeur 64 bits lors de la compilation pour des cibles 64 bits.
Pour résoudre cet avertissement, utilisez size_tplutôt que type.
Exemple
L'exemple suivant génère l'erreur 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'erreur C4267 peut également être provoquée sur x86 et cet avertissement ne peut pas être résolu dans le code, mais peut être ignoré et supprimé avec le pragma warning.
Dans cette situation, l'erreur C4267 est provoquée par une limitation dans les avertissements /Wp64. Sur x86, std::cout<<range_index est résolu à la surcharge de operator<< qui accepte unsigned int, car size_t a la valeur unsigned int sur Win32. L'erreur C4267 se produit parce que vous avez passé size_t comme argument unsigned int, ce qui entraînerait sur Win64 une troncation où size_t a la valeur 64 bits, mais unsigned int a toujours la valeur 32 bits. Il peut être ignoré, car si vous avez compilé pour Win64, std::cout<<range_index est résolu en la surcharge de operator<< qui accepte unsigned __int64, car c'est cette valeur que possède le type size_t sur Win64. Le compilateur 32 bits ne le remarque pas ; il affiche donc cet avertissement.
L'exemple suivant génère l'erreur 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
}