TL;DR:TRUE
并且FALSE
默认情况下未定义,并且任何未定义的预处理器标记都替换为0
.
完整解释
C++17 标准19.1.7 对 if-group 中的预处理指令进行了说明:
表单的预处理指令
- # if常量表达式换行组选择
- # elif常量表达式换行组选择
检查控制常量表达式的计算结果是否为非零。
(重点补充)
标准 19.1.9 规定了预处理器指令中使用的未定义标识符:
在执行了由于宏扩展和定义宏表达式和has-include-expressions 的评估而导致的所有替换之后,除and之外的所有剩余标识符和关键字都替换为pp-numbertrue
false
0
,然后转换每个预处理标记成令牌。[注意:替代标记(5.5)不是标识符,即使它的拼写完全由字母和下划线组成。因此,它不受此更换的约束。——尾注]
(重点补充)
因此,如果TRUE
或FALSE
未定义,这些将被替换0
并且#if
条件失败。小写变体true
和false
是此规则的例外,可以像 C++ 语言的关键字一样使用。要使条件为真,首先定义标识符,例如:
#define TRUE
或者,如果您想TRUE
作为整数值使用,
#define TRUE 1
这也可以,但不建议这样做:
#define TRUE 5
- 注1:这
#define TRUE 0
是一个定义,TRUE
因此使#if TRUE
条件为真。
- 注意 2:一些头文件(例如 WinDef.h 显然)包含
TRUE
和的定义FALSE
。
迟到答案的理由:这个问题是从后来的重复问题中引用的,并且将受益于参考标准的完整答案。