Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否检查宏函数是否存在(带或不带参数)?_C++_C_Macros_C Preprocessor_Ifndef - Fatal编程技术网

C++ 我是否检查宏函数是否存在(带或不带参数)?

C++ 我是否检查宏函数是否存在(带或不带参数)?,c++,c,macros,c-preprocessor,ifndef,C++,C,Macros,C Preprocessor,Ifndef,在定义宏函数之前,我可以检查它是否已经存在 (这样可以避免覆盖以前的定义) 我可以实现如下检查和定义: #ifndef MACRO(X) #define MACRO(X) FUNCTION(X) #endif 或者像这样: #ifndef MACRO #define MACRO(X) FUNCTION(X) #endif 当函数已经定义时,这两种方法似乎都能起作用。 那么,哪一个是正确的?首选哪一种?不带 该标准规定,#ifndef等同于#if!定义的,并且定义的的参数必须是标识符(可能带括

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

我可以实现如下检查和定义:

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

#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif
当函数已经定义时,这两种方法似乎都能起作用。
那么,哪一个是正确的?首选哪一种?

不带


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

没有括号。因此:

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) ^ $gcc test.c test.c:2:13:警告:#ifdef指令末尾的额外令牌[默认启用] #ifdef宏(x) ^
它给出了一个警告。

我不使用parens/参数。第二个参数是正确的。第一个是未定义的行为