当"while" - C中使用常量时,为什么MSVC会生成警告C4127

Nav*_*K N 9 c compiler-warnings visual-c++ c4127

对于代码,

while(1)
{
   /* ..... */
}
Run Code Online (Sandbox Code Playgroud)

MSVC生成以下警告.

warning C4127: conditional expression is constant
Run Code Online (Sandbox Code Playgroud)

警告的MSDN页面建议使用for(;;)而不是while(1).我想知道它有什么优势for(;;)以及为什么它会在不断使用中发出警告while

我应该在GCC上使用什么标志来获得相同的警告?

Nor*_*ame 14

恒定条件通常就足够了.考虑一下:

unsigned k; 
...
while (k>=0) 
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

k>=0如果k是带符号的int,则条件有意义,但对于unsigned则不然.粗心的开发人员忘记了k被声明为无符号,并且他/她会使用它,好像它可用作负数.编译器试图提供帮助并向您发出警告 while(1),并将编译器放入同一个问题类中.for(;;)是优选的,因为它毫不含糊地意味着`循环永远

  • 编译器很聪明; 足够聪明地做各种魔法,但不够聪明,不能理解"虽然(真实)"不受这些问题的影响? (3认同)

GMa*_*ckG 8

for(;;)并且while (true)不同之处在于,前者是被定义为无限循环的特殊情况,而后者则是"真实,永远"的滥用.

警告出现是因为当你不想要它们时,无限循环是非常糟糕的,所以它警告你,你可能在第一个标志处有一个.但通过使用for(;;),你几乎明确地说"永远循环",并没有什么值得警告的.

我不认为海湾合作委员会有同等的警告.