sha*_*oth 10 c++ compiler-construction compiler-warnings visual-c++
当我使用带有"警告级别4"的Visual C++ 9编译C++代码时,如下所示:
while( true ) {
//loop body with break on certain condition
}
Run Code Online (Sandbox Code Playgroud)
以下内容:
for( ; true; ) {
//same loop body
}
Run Code Online (Sandbox Code Playgroud)
两者都触发C4127: conditional expression is constant
警告,但以下内容:
for( ; ; ) {
//same loop body
}
Run Code Online (Sandbox Code Playgroud)
编译时没有警告.
为什么会出现这种差异,尤其是第二种和第三种变体之间?
原因很简单,虽然很愚蠢.
诊断无限循环很重要,但这可能不明显:
while(i >= 0) { --i; } // infinite if i unsigned
while(SOME_MACRO(i)) // err, depends on the expansion of macros
Run Code Online (Sandbox Code Playgroud)
编译器的一个很好的特性是为重复测试产生警告,即测试结果总是为真或总是为假,因为当它来自宏扩展或在依赖的上下文中时并不明显.
似乎VC++在这里推得太过分了,而不是考虑同义反复条件警告它可以找到的所有true
或false
条件,即使它们已经在代码中明确说明了.