Расширение макроса C / C ++: от двух до четырех параметров - PullRequest
0 голосов
/ 13 октября 2011

Я пытаюсь преобразовать макрос с двумя параметрами в четырехпараметрический. От определение LIST, которое я не могу изменить, я бы хотел назвать ALL, предоставляя два дополнительных параметра.

#define LIST(x) \
   x(p1, p2)    \
   x(p3, p4)    \
   x(...

#define ALL(A, B, C, D) .../... do stuff with A, B, C and D

Вот что я попробовал до сих пор:

#define RIGHT(C, D) C, D)
#define LEFT(A, B) (A, B, RIGHT

Но когда я тестирую его (gcc -E text.cpp) с LIST( ALL LEFT (q1, q2) ) I получить следующую ошибку:

ошибка: неопределенный список аргументов вызывает макрос "ALL"

При более внимательном рассмотрении, вот почему:

  1. LIST подставляется вместо первой строки ALL LEFT (q1, q2)(p1, p2)
  2. LEFT заменяется на ALL (q1, q2, RIGHT(p1, p2)
  3. Препроцессор пытается развернуть ALL, но не находит закрытие в скобках есть ошибка ...

Как я могу поступить иначе?

Спасибо.

EDIT:

Точнее, с заданным вводом:

#define LIST(x) \
   x("p1", "p2")    \
   x("p3", "p4")    \
   x("p5", "p6")
#define ALL(A, B, C, D) {A, B, C, D}

Я хочу найти способ получить, в результате:

{"q1", "q2", "p1", "p2"}
{"q1", "q2", "p3", "p4"}
{"q1", "q2", "p5", "p6"}

1 Ответ

3 голосов
/ 13 октября 2011

Я вижу два недостатка:

1) Передать имя вспомогательного макроса при использовании LIST:

#define to_all(c, d) ALL("q1", "q2", c, d)
LIST(to_all)

2) Разрешить LIST расширяться до вспомогательных макросов, чтоожидается, что он будет существовать при использовании (это вариант чего-то с именем x-macros).Это, однако, потребует от вас переопределить список:

// Somewhere "central"
#define LIST() \
   LIST_HELPER("p1", "p2")    \
   LIST_HELPER("p3", "p4")    \
   LIST_HELPER("p5", "p6")
#define ALL(A, B, C, D) {A, B, C, D}

// When used:
#define LIST_HELPER(c, d) ALL("q1", "q2", c, d)
LIST()
#undef LIST_HELPER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...