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

时间:2012-08-10 15:05:45

标签: c macros doxygen c-preprocessor

考虑

#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

2 个答案:

答案 0 :(得分:5)

来自C99规范:

  

<强> 6.10.1.3

     

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

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

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

答案 1 :(得分:0)

这听起来像编译器特定的问题。只要你只是使用这个编译器,就试一试 - 在/*do stuff*/部分放一些代码,看看是否编译了代码。