首页 文章

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

提问于
浏览
0

我有以下代码在 if defined 预处理器表达式中使用带参数的宏:

preprocessor-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未定义?

1 回答

  • 1

    行为已定义 . 在C99 6.10.3 / 7宏替换:

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

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

    回到6.10.1条件包含:

    控制条件[...]的表达式,它可能包含表单定义标识符的一元运算符表达式
    或定义的(标识符)
    如果标识符当前被定义为宏名称(即,如果它是预定义的,或者如果它是#define预处理指令的主题而没有介入具有相同主题标识符的#undef指令),则计算结果为1,如果它不是 .

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

相关问题