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

时间:2012-02-01 11:50:44

标签: c macros function-pointers c-preprocessor

我正在尝试创建一个宏函数来定义函数指针,函数等。

这是我正在尝试做的事情:

#define PRO_SIGNAL_MAX 5
#define PRO_SIGNAL( func, param ) (*func [ PRO_SIGNAL_MAX ])(param)

我想用它来声明一个大小为PRO_SIGNAL_MAX的函数指针数组。

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

void PRO_SIGNAL( paint, (Pro_Window*) ); 

我希望它能够生成:

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

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

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

究竟是什么问题?

2 个答案:

答案 0 :(得分:6)

忽略Pro_Window*附近的括号:

void PRO_SIGNAL(paint, Pro_Window*);

宏参数逐字替换,所以最终得到:

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

这是语法错误。

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

#define PRO_SIGNAL(func, param) (*(func)[PRO_SIGNAL_MAX])(param)

答案 1 :(得分:2)

它是(Pro_Window*)部分。您的PRO_SIGNAL( paint, (Pro_Window*) )将扩展为

(*paint [ PRO_SIGNAL_MAX ])((Pro_Window*))

我认为编译对嵌套的括号不满意。

当受到宏扩展的困扰时,通常很好地看看预处理器实际上为编译器提供了什么。但是,如何生成预处理代码因编译器而异。