2012-02-01 43 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*)) 

我想編譯是不樂意的嵌套括號。

當被宏擴展困惑時,往往看看預處理器實際上給編譯器提供了什麼。不過,如何生成預處理代碼隨編譯器而異。