在定义宏功能之前,我可以检查它是否已经存在 (这可以避免覆盖先前的定义)。
我可以像这样实现检查和定义:
#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif
或者像这样:
#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif
当功能已定义时,两者似乎都有效 那么,哪个是正确的?哪个更受欢迎?
答案 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) ^
它会发出警告。