宏名称必须是标识符

时间:2016-06-07 18:29:09

标签: c macros identifier

请告诉我这段代码有什么问题:

// part of main.c

#if have(some_macro)
    printf("Import succeeded!\n");
#else
#   error Import failed!
#endif

// part of utils.h

#define have(macro) defined(macro)

如果我只写#if defined(some_macro)它就有效。
问题是什么?

1 个答案:

答案 0 :(得分:4)

#if扩展为defined后,您无法执行任何操作。这取决于未定义的行为。

从C99标准(强调我的):

  

6.10.1条件包含

     

...

     

3表格的预处理指令

 # if *constant-expression new-line group<sub>opt</sub>*
 # elif *constant-expression new-line group<sub>opt</sub>*

检查控制常量表达式是否计算为非零值。

  

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