在我定义一个宏函数之前,我可以检查它是否已经存在
(这样可以避免覆盖之前的定义)。
我可以像这样实现检查和定义:
#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif
或者像这样:
#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif
当函数已经定义时,两者似乎都可以工作。
那么,哪个是正确的?哪个是首选?
在我定义一个宏函数之前,我可以检查它是否已经存在
(这样可以避免覆盖之前的定义)。
我可以像这样实现检查和定义:
#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
会导致未定义的行为,因此它不可移植。
没有括号。因为这个原因:
测试.c
#ifdef MACRO(x)
#endif
int main() {}
如果你尝试编译这个:
$ gcc test.c test.c:2:13:警告:#ifdef 指令末尾的额外标记[默认启用] #ifdef 宏(x) ^
它发出警告。