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

Sur*_*kar 6 c c++ macros

# if RTC

/* some code */

# endif
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 6

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

这是由语言保证的。

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

这是C ++的用词:

[cpp.cond]/11:由于宏扩展和对define-macro-expressionshas-include-expressionshas-attribute-expressions的求值而进行的所有替换truefalse 0执行后,除之外的所有其余标识符和关键字都被替换为pp-number,然后将每个预处理令牌转换为令牌。[..]

  • @TonyAbouZaidan如果不是,您会怎么做?如果与问题中的代码不同,那么当然您需要编写满足您要求的逻辑。您的计算机程序的任何部分都是如此。但是,不必为了避免编译失败而仅对未声明的宏进行“ #ifdef”检查。 (2认同)

JL2*_*210 1

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

来自 ANSI C90:

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

然而,在 C 标准化之前,编译器中可能不存在这种情况。我曾经看到过关于此问题的 GCC 警告(我认为是在 MinGW 上),但我现在找不到它的来源。

结论:所有符合标准的 C 编译器在遇到这种情况时不应抛出错误。在#if.