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

Tre*_*key 3 c c++ macros c-preprocessor ifndef

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

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

#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif
Run Code Online (Sandbox Code Playgroud)

或者像这样:

#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ian 7

没有.

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