Как развернуть / "preprocess" код шаблона С++

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

Есть ли аналогичный способ для кода шаблона preprocess?

Ответ 1

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

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_)

Ответ 2

У меня есть только ответ на половину.

Я не знаю, как получить исходный код С++ (уже существующий), но компилятор CLang имеет опцию -emit-ast, которая выгружает абстрактное дерево синтаксиса, используемое для представления проанализированного языка. Будут представлены различные экземпляры шаблона.

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

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

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

Ответ 3

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

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

введите описание изображения здесь