7

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

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

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

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

4

4 回答 4

9

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

#if TRUE只会在以下情况下评估为真

  • TRUE被定义
  • TRUE!= 0的值

在您的示例中,既没有TRUE也没有FALSE定义,因此两个块都是错误的并且被排除在外。

于 2012-06-13T13:33:14.073 回答
5

TRUE并且FALSE是Windows 中的,但在WinDef.h.

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

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

于 2012-06-13T13:31:49.120 回答
1

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

#define TRUE 1
#define FALSE 1

现在#if TRUE#if FALSE将是一样的#if 1

于 2012-06-13T13:29:56.373 回答
0

TL;DRTRUE并且FALSE默认情况下未定义,并且任何未定义的预处理器标记都替换为0.

完整解释

C++17 标准19.1.7 对 if-group 中的预处理指令进行了说明

表单的预处理指令

  • # if常量表达式换行组选择
  • # elif常量表达式换行组选择

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

(重点补充)

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

在执行了由于宏扩展和定义宏表达式has-include-expressions 的评估而导致的所有替换之后,除and之外的所有剩余标识符和关键字都替换为pp-numbertruefalse 0,然后转换每个预处理标记成令牌。[注意:替代标记(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 显然)包含TRUE和的定义FALSE

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

于 2021-09-11T19:23:07.377 回答