# if RTC
/* some code */
# endif
是否应使用值定义宏RTC
?我的编译器没有抛出错误。所有编译器都一样吗?定义宏不是更安全吗?
答案 0 :(得分:6)
在这样的预处理指令中,如果未定义宏,则将其视为0
。
这是语言所保证的。
您可以依靠它而不会出现编译失败。
这是C ++的用语:
[cpp.cond]/11
:由于宏扩展和对定义的宏表达式的评估而进行的所有替换之后,具有包含表达式和有-attribute-expressions 已执行,除true
和false
以外的所有其余标识符和关键字已替换为 pp-number { {1}} ,然后将每个预处理令牌转换为令牌。 [..]
答案 1 :(得分:1)
否,不必定义。如果标识符在#if
扩展末尾未定义,则其结果为0
。
从ANSI C90:
在执行了由于宏扩展和
defined
一元运算符引起的所有替换之后,所有剩余的标识符都被替换为pp号0
。
但是,从C标准化开始,它可能就不存在于编译器中。我曾经看到有关此问题的GCC警告(我认为这是在MinGW上),但我现在找不到它的来源。
结论:所有符合标准的C编译器均不应在遇到此错误时抛出错误。在#if
中使用宏之前,无需定义宏。