2012-02-01 90 views
2

我试图定义函数指针创建一个微距功能,功能等函数和函数指针声明的宏?

这里就是我想要做的事:

#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| 

究竟是什么问题?

+1

您使用它的方式,宏会生成一对双括号,如((Pro_window *))。 – wildplasser 2012-02-01 11:57:24

+1

我强烈建议你改用typedefs。这个宏并没有明显的目的,只是让读者感到困惑。 – Lundin 2012-02-01 12:37:23

回答

5

省略括号周围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) 
2

(Pro_Window*)部分。你PRO_SIGNAL(paint, (Pro_Window*))将扩大到

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

我想编译是不乐意的嵌套括号。

当被宏扩展困惑时,往往看看预处理器实际上给编译器提供了什么。不过,如何生成预处理代码随编译器而异。