我应该使用带括号还是不带括号来检查宏函数的存在?

3
在定义宏函数之前,我可以检查它是否已经存在(以避免覆盖先前的定义)。我可以这样实现检查和定义:
#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif

或者像这样:
#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif

当函数已经定义时,这两种方法似乎都可以使用。
那么,哪种方法是正确的?哪种方法更好?


我会省略括号/参数。 - Jerry Coffin
第二个是正确的。第一个是未定义行为。 - M.M
2个回答

7

没有。

标准规定 #ifndef 等价于 #if !defined,并且 defined 的参数必须是一个(可能带括号的)标识符。你不能在标识符中加括号,因此 defined MACRO(X) 不是一种允许的形式。使用 defined 会导致未定义行为,因此不具备可移植性。


2

不使用括号。因为这个原因:

test.c

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

如果您尝试编译这个程序:

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

它会给出一个警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接