我有以下代码在 if defined 预处理器表达式中使用带参数的宏:
预处理程序games.c :
#define EXAMPLE_MACRO(arg1,arg2) (\
arg1 > arg2)
#if defined(EXAMPLE_MACRO)
#endif
我使用GCC对其进行预处理,它可以正常工作:
$ gcc -E -undef -traditional -x assembler-with-cpp preprocessor-games.c -o preprocessed-games.c
$ echo $?
0
$
它会产生可接受的输出:
# 1 "preprocessor-games.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 17 "/usr/include/stdc-predef.h" 3 4
# 1 "<command-line>" 2
# 1 "preprocessor-games.c"
我使用备用预处理器预处理它 - cpphs(旨在使GCC的预处理器足够接近仿真以适用于Haskell) - 我得到一个空的输出文件和错误消息:
$ cpphs --cpp -E -undef -traditional -x assembler-with-cpp preprocessor-games.c -o preprocessed-games.c
cpphs: macro EXAMPLE_MACRO expected 2 arguments, but was given 0
$ echo $?
1
$
cpphs是错误的还是macros with arguments中if defined expressions的行为未定义?
答案 0 :(得分:1)
定义了行为。在C99 6.10.3 / 7 宏替换:
紧跟
define
之后的标识符称为宏名称。
(以下段落继续并定义类似对象的宏和类似函数的宏。但宏名称是通用的。)
回到6.10.1 条件包含:
控制条件[...]的表达式,它可能包含格式
的一元运算符表达式defined identifier
或
defined ( identifier )
如果标识符当前被定义为宏名称(即,如果它是预定义的,或者如果它是
#define
预处理指令的主题而没有插入#undef
指令,则计算结果为1具有相同的主题标识符),如果不是,则为0。
类似对象或类似函数的宏之间没有区别:defined
检查已定义的宏名称,这适用于两者。