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

时间:2019-09-19 12:09:40

标签: c++ c macros

# if RTC

/* some code */

# endif

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

2 个答案:

答案 0 :(得分:6)

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

这是语言所保证的。

您可以依靠它而不会出现编译失败。

这是C ++的用语:

  

[cpp.cond]/11:由于宏扩展和对定义的宏表达式的评估而进行的所有替换之后,具有包含表达式有-attribute-expressions 已执行,truefalse以外的所有其余标识符和关键字已替换为 pp-number { {1}} ,然后将每个预处理令牌转换为令牌。 [..]

答案 1 :(得分:1)

否,不必定义。如果标识符在#if扩展末尾未定义,则其结果为0

从ANSI C90:

  

在执行了由于宏扩展和defined一元运算符引起的所有替换之后,所有剩余的标识符都被替换为pp号0

但是,从C标准化开始,它可能就不存在于编译器中。我曾经看到有关此问题的GCC警告(我认为这是在MinGW上),但我现在找不到它的来源。

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