要在C ++中正确调试复杂的宏,我通常会对它们运行预处理器,以便准确查看生成的代码的样子。
是否有类似的方法来“预处理”模板代码?
答案 0 :(得分:18)
一种方式(依赖于编译器)是在每个编译器步骤之后使用转储。我写了一个小程序:
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_)
答案 1 :(得分:7)
CLang编译器具有一个选项-emit-ast
,它转储用于表示已解析语言的抽象语法树。将表示模板的各种实例化。
AST在内存和xml版本中都有表示,因此您可以:
对于大多数代码检查(包括检查所选的重载),我发现实际读取XML输出(以及通过它进行浏览)足以满足我的需求。
答案 2 :(得分:1)