如果定义的表达式未定义,cpphs是错误的还是带有参数的宏的行为?

时间:2016-01-10 19:20:43

标签: gcc macros c-preprocessor undefined-behavior

我有以下代码在 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 argumentsif defined expressions的行为未定义?

1 个答案:

答案 0 :(得分:1)

定义了行为。在C99 6.10.3 / 7 宏替换

  

紧跟define之后的标识符称为宏名称

(以下段落继续并定义类似对象的宏类似函数的宏。但宏名称是通用的。)

回到6.10.1 条件包含

  

控制条件[...]的表达式,它可能包含格式

的一元运算符表达式
defined identifier
     

defined ( identifier )
     

如果标识符当前被定义为宏名称(即,如果它是预定义的,或者如果它是#define预处理指令的主题而没有插入#undef指令,则计算结果为1具有相同的主题标识符),如果不是,则为0。

类似对象或类似函数的宏之间没有区别:defined检查已定义的宏名称,这适用于两者。