与conversion to ‘size_t’ from ‘int’ may change the sign of the result - GCC , C中描述的内容一样,我反而希望确保在GCC 4.2下收到警告。 1在VS2008 SP1下同时在32位和64位编译下标记,与禁用GCC下的警告以适应VS2008。强制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,还是/ w3 some_warning_number或/ w4 some_warning_number等等。
现在,我不想贬低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
EDIT#1:看到,因为这可能是一个Visual Studio的特质,我发布到Visual C++ Developer Center - warning C4018: '<' : signed/unsigned mismatch is emitted for 32-bit but not 64-bit compilation under VS2008 SP1 on 64-bit Windows。编辑#2:我被指示从Visual C++ Developer Center posting和今天(2011-01-11)发布到Microsoft Connect,微软回答了我的问题,并将其验证为编译器问题:他们表示将添加该问题到未来版本中的待办事项:Microsoft Connect - warning C4018: '<' : signed/unsigned mismatch is only emitted between like-sized types。
是的,你是对的,它似乎显示在32位构建但不是在64位构建下的警告。 – bgoodr 2010-12-11 01:45:58