考虑
#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
答案 0 :(得分:5)
来自C99规范:
<强> 6.10.1.3 强>
在评估之前,将在预处理令牌列表中进行宏调用 控制常量表达式被替换(除了那些修改过的宏名称) 由定义的一元运算符),就像在普通文本中一样。如果定义的令牌是 由于此替换过程或使用定义的一元运算符而生成的 在宏替换之前,它与两个指定表单中的一个不匹配,行为是 未定义。
因此,如果您使用的宏扩展为defined
,则结果是未定义的。
与C规范中的大多数未定义的东西一样,它是未定义的,因为标准之前的实现以不同的方式处理它。
答案 1 :(得分:0)
这听起来像编译器特定的问题。只要你只是使用这个编译器,就试一试 - 在/*do stuff*/
部分放一些代码,看看是否编译了代码。