'int'から'size_t'への変換で説明されたものと同じ行に沿って、結果の符号が変わる可能性があります-GCC、C 、代わりに、GCC4.2.1で受信する警告にもフラグが付けられるようにします32ビットと64ビットの両方のコンパイルでのVS2008SP1では、VS2008に合わせてGCCでの警告を無効にします。
たとえば、64ビット条件下のGCC 4.2.1では、-Wall条件下での警告として次のように表示されます。
#include <string.h>
bool foo()
{
size_t len = 0;
const char * someBuffer = "flubber";
len = strlen(someBuffer);
bool retval = false;
for (int j = 0; j < len; j++) // <-- warning
{
if (someBuffer[j] != '0')
{
retval = true;
break;
}
}
return retval;
}
GCCの警告は次のとおりです。
warning: comparison between signed and unsigned integer expressions
ただし、VS2008 SP1 64ビットコンパイラでは、どのタイプのプラグマを試しても、/W3または/W4、または/ w3some_warning_numberまたは/ w4some_warning_numberなどを使用して何を有効にしてもフラグは立てられません。
さて、GCCの警告レベルを下げたり、警告を無効にしたりしたくありません。なぜなら、GCCには非常に正当な理由で警告があったからです。したがって、/ WXが有効になっている場合、VSビルドが同様の方法で失敗するようにしたいと思います。これは私が一緒に暮らさなければならないものですか、それともVS2008でトリックを行う警告がありますか?
編集:警告は、32ビットビルドでは表示されますが、64ビットビルドでは表示されません。以下に示すように、同じコンパイラオプションのセットを使用します。
/O2
/Ob2
/D "WIN32"
/D "_WINDOWS"
/D "NDEBUG"
/D "_CRT_SECURE_NO_WARNINGS"
/D "__WIN32__"
/D "_SCL_SECURE_NO_WARNINGS"
/D "_BIND_TO_CURRENT_MFC_VERSION"
/D "_BIND_TO_CURRENT_CRT_VERSION"
/D "WINVER=0x0502"
/D "_WIN32_WINNT=0x0502"
/D "_WIN32"
/D "_NT"
/D "_CRT_NONSTDC_NO_WARNINGS"
/D "_MBCS"
/FD
/EHsc
/MD
/W3
/WX
/TP
/Zm1000
編集#1:これはVisual Studioの特異性である可能性があるため、Visual C ++ Developer Centerに投稿しました-警告C4018:'<':32ビットでは符号付き/符号なしの不一致が発生しますが、64のVS2008SP1では64ビットのコンパイルでは発生しません-ビットWindows。
編集#2: Visual C++開発者センターの投稿内からMicrosoftConnectに投稿するように指示され、今日(2011-01-11)Microsoftは私の質問に回答し、コンパイラの問題として検証しました:問題が追加されると述べました将来のリリースで修正されるバックログへ:Microsoft Connect-警告C4018:'<':署名付き/署名なしの不一致は同じサイズのタイプ間でのみ発生します。