请告诉我这段代码有什么问题:
// 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)
它就有效。
问题是什么?
答案 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
一元运算符与两个指定表单中的一个不匹配,则行为未定义< /强>