当我使用Visual C 9编译C代码时,“警告级别4”如下:
while( true ) { //loop body with break on certain condition }
和以下内容:
for( ; true; ) { //same loop body }
两个触发器C4127:条件表达式是常量警告,但是如下:
for( ; ; ) { //same loop body }
编译没有警告.
为什么这种差异,特别是在第二和第三种变体之间?
解决方法
原因很简单,虽然很愚蠢.
诊断无限循环很重要,但这可能不明显:
while(i >= 0) { --i; } // infinite if i unsigned while(SOME_MACRO(i)) // err,depends on the expansion of macros
编译器的一个很大的特点就是产生一个重言式测试的警告,这是一个测试,总是真的或者总是假的,因为它来自宏扩展或从属上下文中并不明显.
似乎VC在这里推了一个太远,而不是考虑重复条件警告所有真实或虚假的条件,即使他们已经在代码中已经清楚地说明了.