我是否检查带或不带括号的宏函数的存在?

Do I check the existence of a macro function with or without the parens?

在我定义一个宏函数之前,我可以检查它是否已经存在
(这避免了覆盖以前的定义)。

我可以这样实现检查和定义:

#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif

或者像这样:

#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif

当函数已定义时,两者似乎都有效。
那么,哪个是正确的?哪个更受欢迎?

没有。

标准规定 #ifndef 等同于 #if !defineddefined 的参数必须是(可能带括号的)标识符.标识符中不能有括号,因此 defined MACRO(X) 不是允许的形式。 defined 的这种使用会导致未定义的行为,因此它不可移植。

没有括号。因为这个原因:

test.c

#ifdef MACRO(x)
#endif
int main() {}

如果你尝试编译这个:

$ gcc test.c
test.c:2:13: warning: extra tokens at end of #ifdef directive [enabled by default]
 #ifdef MACRO(x)
             ^

它给出警告。