Как развернуть / "предварительно обработать" код шаблона C ++ - PullRequest
38 голосов
/ 04 марта 2011

Для правильной отладки сложных макросов в C ++ я обычно запускаю на них препроцессор, чтобы точно увидеть, как выглядит результирующий код.

Есть ли аналогичный способ "предварительной обработки" кода шаблона?

Ответы [ 3 ]

18 голосов
/ 04 марта 2011

Один из способов (зависит от компилятора) - использовать дамп после каждого шага компилятора. Я написал небольшую программу:

template<class T>
T square(T n)
{
    return n * n;
}

int main(void)
{
    square<int>(3);
    square<float>(3.0);
}

тогда:

g++ -fdump-rtl-all test.cc

Это принесет мне кучу файлов. Взгляните на (в моем случае) test.cc.218.dfinish:

;; Function int main() (main)
;; Function T square(T) [with T = int] (_Z6squareIiET_S0_)
;; Function T square(T) [with T = float] (_Z6squareIfET_S0_)
7 голосов
/ 04 марта 2011

Компилятор CLang имеет опцию -emit-ast, которая выводит абстрактное синтаксическое дерево, используемое для представления анализируемого языка.Будут представлены различные экземпляры шаблона.

AST представлен как в памяти, так и в XML-версии, поэтому вы можете:

  • просто использовать вывод XML
  • разберите его, затем создайте некоторый код C ++
  • , создайте инструмент перезаписи (поддерживается непосредственно в CLang) и используйте сам AST

Для большинства проверок кода (включая проверку выбранных перегрузок)) Я обнаружил, что на самом деле чтение выходных данных XML (ну, конечно, их просмотр) было достаточно для моих нужд.

1 голос
/ 20 июня 2016

Это довольно старый вопрос, но я думаю, что в этой области произошли значительные улучшения, которые пока не так широко известны (пока).

Metashell может использоваться как своего рода GDB для создания шаблонов.Это (насколько я знаю) основано на инструментах Clang.

enter image description here

...