次の方法で共有


コンパイラの警告 (レベル 3) C4267

'var' : 'size_t' から '型'への変換です。データが失われる可能性があります。

/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 プラグマで無視して表示されないようにできます。

この場合、C4267 は /Wp64 警告の制約が原因で発生します。 x86 では、std::cout<<range_index は unsigned int を受け入れる operator<< のオーバーロードに解決します。これは、Win32 では size_t が unsigned int になるからです。 size_t が unsigned int 引数として渡されると、Win64 では size_t が 64 ビットであるのに対し unsigned int が 32 ビットのままであるため切り捨てが行われ、これにより C4267 が発生します。 Win64 対応のコンパイルを行う場合、std::cout<<range_index は、Win64 での size_t 型である unsigned __int64 を受け入れる operator<< のオーバーロードに解決するため、このエラーを無視できます。 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
}