与GCC,C中将'int'转换为'size_t'可能会改变结果的符号所述的情形类似,我希望确保我在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
但是,无论我尝试使用什么类型的编译器指令或者使用/W3或/W4或/w3某个警告号码或/w4某个警告号码等开启哪些编译器选项,VS2008 SP1 64位编译器都没有标记出来。
现在,我不想降低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 - 在64位Windows下,在VS2008 SP1下进行32位但不进行64位编译时发出警告C4018:'<':签名/无符号不匹配。
编辑#2:我被引导从Visual C++ Developer Center posting内部发布到Microsoft Connect,并且今天(2011-01-11)Microsoft回答了我的问题并将其验证为编译器问题:他们表示该问题将添加到待修复的后续版本中:Microsoft Connect - 警告C4018:'<':仅在相同大小的类型之间发出签名/无符号不匹配。