考虑
#define FOOBAR (defined(FOO) || defined(BAR))
#if FOOBAR
/* Do stuff. */
#endif
这应该工作吗?我问是因为显然我的编译器对此没有问题,但是 doxygen 内部预处理器认为#if
. 我知道我可以解决这个问题
#if defined(FOO) || defined(BAR)
#define FOOBAR 1
#endif
#if FOOBAR
/* Do stuff. */
#endif
考虑
#define FOOBAR (defined(FOO) || defined(BAR))
#if FOOBAR
/* Do stuff. */
#endif
这应该工作吗?我问是因为显然我的编译器对此没有问题,但是 doxygen 内部预处理器认为#if
. 我知道我可以解决这个问题
#if defined(FOO) || defined(BAR)
#define FOOBAR 1
#endif
#if FOOBAR
/* Do stuff. */
#endif
从 C99 规范:
6.10.1.3
在评估之前,预处理标记列表中将成为控制常量表达式的宏调用被替换(除了那些由定义的一元运算符修改的宏名称),就像在普通文本中一样。如果定义的标记是作为替换过程的结果生成的,或者使用定义的一元运算符与宏替换之前的两种指定形式之一不匹配,则行为未定义。
因此,如果您使用扩展defined
为您所做的宏,则结果是未定义的。
与 C 规范中的大多数未定义的东西一样,它是未定义的,因为标准之前的实现对它的处理方式不同。
这听起来像是一个特定于编译器的问题。只要你只是在使用这个编译器,就试一试——在/*do stuff*/
零件里放一些代码,看看代码是否被编译。