Чтобы правильно отлаживать сложные макросы в С++, я обычно запускаю на них препроцессор, чтобы точно увидеть, как выглядит полученный код.
Есть ли аналогичный способ для кода шаблона preprocess?
Чтобы правильно отлаживать сложные макросы в С++, я обычно запускаю на них препроцессор, чтобы точно увидеть, как выглядит полученный код.
Есть ли аналогичный способ для кода шаблона preprocess?
Один из способов (зависит от компилятора) - использовать демпинг после каждого этапа компилятора. Я написал небольшую программу:
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_)
У меня есть только ответ на половину.
Я не знаю, как получить исходный код С++ (уже существующий), но компилятор CLang имеет опцию -emit-ast
, которая выгружает абстрактное дерево синтаксиса, используемое для представления проанализированного языка. Будут представлены различные экземпляры шаблона.
AST представлен как в памяти, так и в версии xml, поэтому вы можете:
Для большинства проверок кода (включая проверку выбранных перегрузок) я обнаружил, что на самом деле чтение XML-вывода (ну, grepping через него) было достаточно для моих нужд.
Это довольно старый вопрос, но я думаю, что в этой области произошли значительные улучшения, которые не так широко известны (пока).
Metashell можно использовать как своего рода gdb для экземпляров шаблонов. Это (насколько я знаю) опирается на инструментальные инструменты.