我有以下代码在 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 回答
行为已定义 . 在C99 6.10.3 / 7宏替换:
(以下段落继续并定义类似对象的宏和类似函数的宏 . 但宏名称是通用的 . )
回到6.10.1条件包含:
类对象或类似函数的宏之间没有区别:
defined
检查已定义的宏名称,这适用于两者 .