Кажется, что вставка токенов не работает с макросами C ++ - PullRequest
1 голос
/ 26 февраля 2012

Я пытаюсь имитировать поведение шаблона в C ++ с помощью макросов.Например, если бы я хотел получить список int *, я бы сделал что-то вроде этого:

typedef int* IntPtr;
List_DEFINE(IntPtr)

Обратите внимание, что List_DEFINE (IntPtr) не имеет точки с запятой, потому что это макрос.Я написал свой список «класс» (на самом деле просто пара структур с указателями методов) и протестировал его перед тем, как сделать его макросом.Сейчас я пытаюсь «макротизировать» мой код, и у меня возникают проблемы.Я определил свой макрос следующим образом:

#define List_DEFINE(t) \
struct List_##t_Node { \
...

В вышеприведенном примере я думал, что ## t будет заменено тем, что было передано в t, но, похоже, это не так.Если я определяю два разных типа списков, я получаю следующую ошибку:

test.cpp:85: error: redefinition of ‘struct List_t_Node’
test.cpp:75: error: previous definition of ‘struct List_t_Node’

Так что в приведенном выше примере я хотел бы, чтобы генерировалась структура List_IntPtr_Node, но вместо этого генерировался List_t_Node.Почему?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2012

Токен после ## равен t_Node, поэтому препроцессор вставляет List_ в t_Node.

Чтобы заменить t параметром макроса, это должен быть один токенкоторый затем может быть вставлен в предыдущий List_ и следующий _Node:

#define List_DEFINE(t) \
   struct List_ ## t ## _Node { \
   ...
2 голосов
/ 26 февраля 2012

Вам нужно

List_##t##_Node
      //^^

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