Макрос для объявления функций и указателей на функции? - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь создать макрос-функцию для определения указателей на функции, функций и т. Д.

Вот что я пытаюсь сделать:

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

6 голосов
/ 01 февраля 2012

Пропустите скобки вокруг 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 голосов
/ 01 февраля 2012

Это часть (Pro_Window*). Ваш PRO_SIGNAL( paint, (Pro_Window*) ) расширится до

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

Полагаю, компиляция недовольна вложенными скобками.

Когда озадачено раскрытием макроса, часто полезно посмотреть, что на самом деле препроцессор подает компилятору. Однако способ генерации предварительно обработанного кода зависит от компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...