【问题标题】:C++, using #if TRUE conditional directiveC++,使用 #if TRUE 条件指令
【发布时间】:2012-06-13 13:26:07
【问题描述】:

当使用像#if TRUE 这样的语句时,我应该期待会发生什么?一个解释将不胜感激!我了解#if 1 的工作原理,但它在我的代码中给出的结果与使用#if TRUE 完全不同。我知道#if 是一个条件指令,这意味着什么;这只是我不明白的TRUE(或FALSE)部分。似乎以这种方式使用它永远不会执行语句之后的代码。这是一个例子:

#if TRUE
     cout << "true" << endl;
#endif

#if FALSE
     cout << "false" << endl;
#endif

我似乎从来没有看到“真”或“假”打印到屏幕上,使用 Visual Studio,内部语句自动变灰。

【问题讨论】:

  • 您只需测试是否声明了该宏。通常在 WinDef.h 中,它们被声明为与 BOOL 一起使用。
  • “TRUE”不是保留字吗?
  • 不,它只是一个用#define win WinDef.h 声明的宏(参见msdn.microsoft.com/en-us/library/windows/desktop/…)。保留字为“true”(小写)。
  • 如果这是一个宏,通常会在哪里定义?我试过搜索所有文档都没有运气。
  • 欢迎您。看我之前的cmets,它是在头文件WinDef.h中定义的

标签: c++ c-preprocessor


【解决方案1】:

预处理器将包含/排除#if #endif 块的内容,具体取决于#if 之后的表达式的计算结果为真还是假。

#if TRUE 只有在

时才会评估为真
  • 定义了宏TRUE
  • TRUE 的值!= 0

在您的示例中,TRUEFALSE 均未定义,因此这两个块都是错误的并被排除在外。

【讨论】:

    【解决方案2】:

    TRUEFALSE 在 Windows 中是,但在 WinDef.h 中声明。

    如果包含标题,您会看到 TRUE1FALSE0。所以,第一条语句应该执行,第二条不应该执行。

    如果您不包含标头,则两者都将是未定义的,并且不会执行任何语句。

    【讨论】:

    • 非常感谢!谢谢!
    【解决方案3】:

    要查看打印的truefalse,您需要定义它们:

    #define TRUE 1
    #define FALSE 1
    

    现在#if TRUE#if FALSE 将与#if 1 相同。

    【讨论】:

    • 修改答案将FALSE定义为0
    • 但是后面的陈述不再正确;)。
    • @FatalError 然后使用 #ifdef FALSE
    • @FatalError:是的。通常它被定义为 0,但为了说明如何使两个 #if 语句都为真,我将它设置为 1。
    • 当然,我从来没有说它是“错误的”,只是说它是“不寻常的”。
    【解决方案4】:

    TL;DRTRUEFALSE 默认未定义,任何未定义的预处理器标记都将替换为 0

    完整解释

    C++17 standard 19.1.7 在 if-group 中说明了这一点:

    表单的预处理指令

    • # if 常量表达式换行 group-opt
    • # elif 常量表达式换行 group-opt

    检查控制常量表达式是否计算为非零

    (已添加重点)

    标准 19.1.9 规定了预处理器指令中使用的未定义标识符:

    在由于宏扩展和 defined-macro-expressionshas-include-expressions 的评估而导致的所有替换都已执行后,所有剩余的标识符和关键字,除truefalse外,都替换为pp-number0,然后将每个预处理token转换成一个token。 [ 注意:一个 替代标记 (5.5) 不是标识符,即使它的拼写完全由字母和下划线组成。 因此,它不受此更换的约束。 — 尾注 ]

    (已添加重点)

    因此,如果未定义 TRUEFALSE,则这些将替换为 0 并且 #if 条件失败。小写变体truefalse 是此规则的例外,可以像C++ 语言的关键字一样使用。 要使条件为真,请先定义标识符,例如:

    #define TRUE
    

    或者,如果您希望 TRUE 以整数值的形式提供,

    #define TRUE 1
    

    这也可以,虽然不推荐:

    #define TRUE 5
    
    • 注意 1:#define TRUE 0 TRUE 的定义,因此使 #if TRUE 条件为真。
    • 注意 2:某些标头(例如 WinDef.h 显然)包含 TRUEFALSE 的定义。

    迟到答案的理由:这个问题是从后面的重复问题中引用的,并且将受益于参考标准的完整答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多