我是否检查带或不带括号的宏函数的存在?
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 !defined
,defined
的参数必须是(可能带括号的)标识符.标识符中不能有括号,因此 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)
^
它给出警告。
在我定义一个宏函数之前,我可以检查它是否已经存在
(这避免了覆盖以前的定义)。
我可以这样实现检查和定义:
#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif
或者像这样:
#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif
当函数已定义时,两者似乎都有效。
那么,哪个是正确的?哪个更受欢迎?
没有。
标准规定 #ifndef
等同于 #if !defined
,defined
的参数必须是(可能带括号的)标识符.标识符中不能有括号,因此 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) ^
它给出警告。