【问题标题】:PC Lint while(TRUE) vs for(;;)PC Lint while(TRUE) 与 for(;;)
【发布时间】:2011-11-23 14:29:09
【问题描述】:

我是第一次使用 PC Lint。当 PC Lint 警告我关于我的 while(TRUE) 时,我正在“整理”我的代码。

它是这样说的:

716: while(1) ... -- 找到了形式为 while(1) ... 的构造。

而 this 表示上下文中期望布尔值的常量, 它可能反映了一种编程策略,即无限循环 以这个结构为前缀。因此,它被赋予了一个单独的数字,并且 已归入信息类。更常规的 无限循环前缀的形式是for(;;)。

我不明白这句话。谁能帮我理解它?

【问题讨论】:

  • 如果有人将TRUE 设置为0while(TRUE) 可能不是无限循环,而for(;;) 则不可能发生这种情况。
  • @Dan D.,当然有——毕竟我们在谈论预处理器。 #define for(;;) if(0) 怎么样? ;-)
  • 我知道它在说什么,但我不得不说这是一个奇怪的解释。
  • @PéterTörök: #define for(;;) if(0) 是非法的,因为 for(;;) 不是标识符,也不能被解析为宏声明
  • @Armen,很公平,我的 C 技能已经生疏了。我相信虽然可能很容易有一些扭曲的方式来实际做到这一点。如果有人邪恶到重新定义TRUE,他也可以重新定义for :-(

标签: c embedded lint pc-lint


【解决方案1】:

文中说虽然while(TRUE)(被预处理为while(1))是一个完全有效的无限循环,但更传统的无限循环编写形式是

for(;;)
{
   ...
} 

因为它根本不使用任何值,因此不易出错。

【讨论】:

    【解决方案2】:

    它说更传统的无限循环是for(;;),我会说这是一个有争议的断言,并且它将此构造归类为“信息类别”发现 - 我怀疑如果你使用for(;;)相反,它会消失。我一直把这些写成while(1),而我自己从来没有写过for(;;)。如果它符合您的预期,我会忽略 PC LINT 对此的调查结果,或者如果您担心有人重新定义 TRUE 因为 if 有人重新定义了 TRUE 您的循环不会根本不运行。

    【讨论】:

    • 不管怎样,如果有人重新定义了TRUE,那么实用的循环不会无限运行将是你最小的麻烦:-)
    猜你喜欢
    • 2010-10-01
    • 2012-12-13
    • 2011-04-17
    • 1970-01-01
    • 2011-03-21
    • 2014-07-30
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多