Как сформировать список всех вхождений макроса? - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть несколько объявлений struct, помеченных макросом COMPONENT.Я хотел бы построить список типов из этих объявлений.Учитывая этот код:

// a.hpp

COMPONENT(A) {
  // struct body
};

// bc.hpp

COMPONENT(B) {
  // struct body
};
COMPONENT(C) {
  // struct body
};

Я хотел бы создать кортеж, который выглядит следующим образом:

constexpr auto components = std::make_tuple(
  Comp<A>{“A”},
  Comp<B>{“B”},
  Comp<C>{“C”}
);

Порядок элементов в кортеже не имеет значения.Мне также нужно будет вручную включить все заголовки, которые содержат COMPONENT объявлений.

Я мог бы написать скрипт Python, который генерирует файл во время сборки, но я хотел бы сделать это с препроцессором, если это возможно.Я не думаю, что это возможно, но я видел, как люди делали какие-то сумасшедшие вещи с препроцессором, поэтому я решил спросить.Я не понимаю макропрограммирование макросов так же хорошо, как метапрограммирование шаблонов.

1 Ответ

0 голосов
/ 07 апреля 2019

Вы не можете сделать это с самим препроцессором Си. Он очень ограничен и не поддерживает полноценный язык сценариев - далеко не все.

Ваши два курса действий:

  1. Использование внешнего интерфейса компилятора для получения синтаксического дерева предварительной обработки (clang может позволить вам сделать это; менее уверен в GCC)
  2. Использование скрипта Python / Perl / bash / awk / sed для поиска использования макроса.

Вариант 1 требует гораздо больше усилий (если вы не можете адаптировать другой существующий инструмент), но точен; Вариант 2 требует небольших усилий, но совершенно неточен без «повторного изобретения колеса» - с ложными срабатываниями (например, имена макросов в строках) и, возможно, также с ложными отрицаниями (например, макрос, применяемый в макросе, когда его имя генерируется путем объединения идентификаторов) .

...