3

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

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

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

或者像这样:

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

当函数已经定义时,两者似乎都可以工作。
那么,哪个是正确的?哪个是首选?

4

2 回答 2

7

没有。

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

于 2016-02-02T01:50:36.680 回答
2

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

测试.c

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

如果你尝试编译这个:

$ gcc test.c
test.c:2:13:警告:#ifdef 指令末尾的额外标记[默认启用]
 #ifdef 宏(x)
             ^

它发出警告。

于 2016-02-02T01:54:09.207 回答