是否应该定义 #if 中使用的宏?

Should a macro used in #if be defined?

本文关键字:定义 #if 是否      更新时间:2023-10-16
# if RTC
/* some code */
# endif

是否应该用值定义宏RTC?我的编译器没有抛出错误。所有编译器都这样做吗?定义宏不是更安全吗?

在这样的预处理指令中,如果未定义宏,则将其视为0

这是由语言保证的。

您可以依靠没有编译失败。

这是C++措辞:

[cpp.cond]/11:在执行了由于宏扩展和对定义的宏表达式has-include-表达式has-attribute-表达式的计算而进行的所有替换后,除truefalse外,所有剩余的标识符和关键字都将替换为pp-number0,然后将每个预处理标记转换为令牌。[..]

不,它不必定义。如果在#if扩展结束时未定义标识符,则其计算结果为0

从 ANSI C90:

在执行了由于宏扩展和defined一元运算符而导致的所有替换后,所有剩余的标识符都将替换为 pp 编号0

但是,在 C 标准化之前的编译器中可能不存在这一点。我曾经看到过一个关于这个的海湾合作委员会警告(我认为它是在MinGW上(,但我现在找不到它的来源。

结论:所有符合标准的 C 编译器在遇到此问题时都不应抛出错误。在#if中使用宏之前,无需定义宏。