与从 'int' 转换为 'size_t'中描述的内容相同,可能会改变结果的符号 - GCC , C,我想确保我在 GCC 4.2.1 下收到的警告也被标记在 32 位和 64 位编译下的 VS2008 SP1 下,而不是在 GCC 下禁用警告以适应 VS2008。
例如,在 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,或 /w3 some_warning_number或 /w4 some_warning_number等启用什么。
现在,我不想降低 GCC 的警告级别或禁用警告,因为他们有很好的理由在那里发出警告。所以我希望 VS 构建在启用 /WX 时以类似的方式失败。这是我必须忍受的事情,还是有一些警告可以在 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++ 开发人员中心 - 警告 C4018: '<' : signed/unsigned mismatch isemitting for 32-bit but not 64-bit compiler under VS2008 SP1 on 64位窗口。
编辑#2:我被指示从Visual C++ 开发人员中心发布到 Microsoft Connect ,今天(2011-01-11)微软回复了我的问题并将其验证为编译器问题:他们表示该问题将添加待在未来版本中修复的积压工作:Microsoft Connect - 警告 C4018: '<' : signed/unsigned mismatch is only sent between like-sized types。