Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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_Macros_Function Pointers_C Preprocessor - Fatal编程技术网

C 函数和函数指针声明的宏?

C 函数和函数指针声明的宏?,c,macros,function-pointers,c-preprocessor,C,Macros,Function Pointers,C Preprocessor,我试图创建一个宏函数来定义函数指针、函数等 以下是我想做的: #define PRO_SIGNAL_MAX 5 #define PRO_SIGNAL( func, param ) (*func [ PRO_SIGNAL_MAX ])(param) 我想用它来声明一个大小为PRO\u SIGNAL\u MAX的函数指针数组 所以,当我在这里使用它时: void PRO_SIGNAL( paint, (Pro_Window*) ); 我希望它生成: void (*paint [ 5 ])(Pr

我试图创建一个宏函数来定义函数指针、函数等

以下是我想做的:

#define PRO_SIGNAL_MAX 5
#define PRO_SIGNAL( func, param ) (*func [ PRO_SIGNAL_MAX ])(param)
我想用它来声明一个大小为
PRO\u SIGNAL\u MAX
的函数指针数组

所以,当我在这里使用它时:

void PRO_SIGNAL( paint, (Pro_Window*) ); 
我希望它生成:

void (*paint [ 5 ])(Pro_Window*) ;

但它并没有像我计划的那样工作,我得到了这个错误:

pro_window.c|16|error: expected declaration specifiers or '...' before '(' token|

到底是什么问题?

省略
Pro\u窗口周围的括号*

void PRO_SIGNAL(paint, Pro_Window*);
宏参数被逐字替换,因此您最终得到:

void (*paint[PRO_SIGNAL_MAX])((Pro_Window*));
这是一个语法错误

此外,最好将宏参数括在宏本身的括号中,因为您永远不知道调用方将传递表达式还是单个标记:

#define PRO_SIGNAL(func, param) (*(func)[PRO_SIGNAL_MAX])(param)
它是
(Pro_窗口*)
部分。您的
PRO\u信号(绘制,(PRO\u窗口*)
将扩展到

(*paint [ PRO_SIGNAL_MAX ])((Pro_Window*))
我想编译人员对嵌套括号不满意


当对宏扩展感到困惑时,最好看看预处理器实际上为编译器提供了什么。但是,如何生成预处理代码因编译器而异

按照您使用它的方式,宏会生成一对双括号,如((Pro_window*)。我强烈建议您改用typedefs。这个宏没有明显的作用,只是让读者感到困惑。