宏扩展后重新扫描'已定义'运算符:它应该有效吗?

Jen*_*ens 4 c macros doxygen c-preprocessor

考虑

#define FOOBAR (defined(FOO) || defined(BAR))

#if FOOBAR
/* Do stuff. */
#endif
Run Code Online (Sandbox Code Playgroud)

这有用吗?我问,因为显然我的编译器没有问题,但doxygen内部预处理器认为有一个语法错误#if.我知道我可以解决这个问题

#if defined(FOO) || defined(BAR)
#define FOOBAR 1
#endif
#if FOOBAR
/* Do stuff. */
#endif
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 5

从C99规范:

6.10.1.3

在评估之前,将替换将成为控制常量表达式的预处理标记列表中的宏调用(除了由定义的一元运算符修改的宏名称之外),就像在普通文本中一样.如果定义的令牌是由于此替换过程而生成的,或者在宏替换之前使用定义的一元运算符与两个指定表单中的一个不匹配,则行为是未定义的.

因此,如果您使用扩展defined为您的宏,则结果是未定义的.

与C规范中的大多数未定义的东西一样,它是未定义的,因为标准之前的实现以不同的方式处理它.