## конкатенация макросов работает не так, как я ожидал - PullRequest
0 голосов
/ 21 апреля 2011

Разве это не должно быть:

#define MOGSH_CONCAT (x,y) x##y
#define MOGSH_DOUBLE (a,b) MOGSH_CONCAT(a,b)
#define MOGSH_DEFINEPROC (p) MOGSH_DOUBLE(_gt,p) options_dialog::p;

MOGSH_DEFINEPROC(AssignMainForm);

счастливо расшириться до:

_gtAssignMainForm options_dialog::AssignMainForm;

Учитывая, что _gt не определено, _gtAssignMainForm равно:

typedef void (__stdcall *_gtAssignMainForm)();

и options_dialog - это просто класс, в котором AssignMainForm является статическим членом.

Вместо этого в MSVC9 я получаю сообщение об ошибке:

'a' : undeclared identifier

в строке, содержащей

MOGSH_DEFINEPROC(AssignMainForm);

1 Ответ

3 голосов
/ 21 апреля 2011

В определении функционально-подобного макроса не может быть пробелов между именем макроса и (, начинающим список параметров.

#define MOGSH_CONCAT(x,y) x##y 
//                  ^ no whitespace allowed here

Как у вас сейчас (с пробелами),MOGSH_CONCAT - это объектоподобный макрос со списком замен (x,y) x##y, поэтому вы получаете такие странные результаты.

...