# if RTC
/* some code */
# endif
是否应该用值定义宏RTC
?我的编译器没有抛出错误。所有编译器都这样做吗?定义宏不是更安全吗?
在这样的预处理指令中,如果未定义宏,则将其视为0
。
这是由语言保证的。
您可以依靠没有编译失败。
这是C++措辞:
[cpp.cond]/11
:在执行了由于宏扩展和对定义的宏表达式、has-include-表达式和has-attribute-表达式的计算而进行的所有替换后,除true
和false
外,所有剩余的标识符和关键字都将替换为pp-number0
,然后将每个预处理标记转换为令牌。[..]
不,它不必定义。如果在#if
扩展结束时未定义标识符,则其计算结果为0
。
从 ANSI C90:
在执行了由于宏扩展和
defined
一元运算符而导致的所有替换后,所有剩余的标识符都将替换为 pp 编号0
。
但是,在 C 标准化之前的编译器中可能不存在这一点。我曾经看到过一个关于这个的海湾合作委员会警告(我认为它是在MinGW上(,但我现在找不到它的来源。
结论:所有符合标准的 C 编译器在遇到此问题时都不应抛出错误。在#if
中使用宏之前,无需定义宏。