我是否检查是否存在具有或不具有parens的宏功能?

时间:2016-02-02 01:44:29

标签: c++ c macros c-preprocessor ifndef

在定义宏功能之前,我可以检查它是否已经存在 (这可以避免覆盖先前的定义)。

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

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

或者像这样:

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

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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

<强> 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)
             ^

它会发出警告。