【问题标题】:C 'TRUE;' StatementC'真;'陈述
【发布时间】:2010-10-18 23:11:09
【问题描述】:

我遇到了一些用 C 编写的代码,看起来像这样:

if (file == NULL)
     TRUE; /* <-- What does that mean? */

我认为这是另一种说法:

if (file == NULL);

但是我是否遗漏了什么,是否有理由使用第一种方式而不是第二种方式?

更新:

做一些挖掘,TRUE是这样定义的:

#define TRUE !0

【问题讨论】:

  • 那么,TRUE 的定义是什么? (inb4 "that's deep") 这就像打开一个问题并说“我看到了 asdjahek,这是什么意思?”我们不知道。
  • @Richard:如前所述,除非您说明 TRUE 扩展为什么,否则无法回答这个问题。 #define TRUE 1#define TRUE abort() 非常不同
  • @James 我不认为TRUE 被定义为abort() :),这没有任何意义......
  • @Richard:这已经没有意义了,这就是你问它的原因。与询问路过的陌生人相比,您在源代码中查找宏会更幸运;-)
  • @Richard:查一下……总之,这都是废话。

标签: c language-features


【解决方案1】:

只是一个猜测 - 我怀疑在历史上的某个时刻有人想在那条 TRUE 行上设置一个断点。

我使用过调试器,这样做可能比尝试设置条件断点更容易。但这可能已经很久很久了。如果我想中断的条件涉及函数调用或者条件断点使事情减慢太多,我仍然发现自己在某些环境中做类似的事情(这在嵌入式目标上经常发生,在调试器中评估条件涉及很多通过 JTAG 链路进行通信)。

但是,无所事事的代码不应该将其纳入版本控制。

【讨论】:

  • 我怀疑这可能是代码的意图,在深入查看了代码之后,在大家的帮助下,谢谢!
  • 但是假设#define TRUE !0 即使在调试版本中,编译器也会为语句TRUE; 生成任何代码?
  • !0 可以在编译时进行评估,任何健全的编译器(即使是当时的 8 位微控制器)至少会做这么多。然而,其中一些会很乐意将1; 编译为MOV AL,#1 或等效项。即使启用了“优化器”,就像我多年前使用的 6809 编译器一样。一个好的编译器会在注意到常量非易失性表达式作为语句后消除整个条件。
  • Keynslug:你是对的(至少对于 Visual Studio)。 “什么都不做”的陈述通常必须更复杂一些(比如file = (FILE* volatile) file;)。
【解决方案2】:

我认为这样写的原因是为了摆脱烦人的编译器警告。

对于 MSVC,第二条语句确实会导致编译器警告 empty controlled statement 或类似的东西。但是TRUE; 是一个常规有效的非空语句。

【讨论】:

  • 我可以想出更好的方法来改进if (file == NULL); 行,假设file 是一个变量的名称。如果后面跟着else,可能原作者不知道!= ;-)
  • 但是如果他把它作为一种TODO: 放在那里,那么让编译器生成警告会更明智。
【解决方案3】:

这看起来像是一个没有效果的语句,但 TRUE 定义为什么(它不是标准的)?如果它只是 1 预期的那样,这没有效果。没有理由这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多