sha*_*kin 40 c++ templates c-preprocessor
为了在C++中正确调试复杂的宏,我通常在它们上运行预处理器,以便准确地查看生成的代码的样子.
是否有类似的方法来"预处理"模板代码?
mav*_*rik 19
一种方式(依赖于编译器)是在每个编译器步骤之后使用转储.我写了一个小程序:
template<class T>
T square(T n)
{
return n * n;
}
int main(void)
{
square<int>(3);
square<float>(3.0);
}
Run Code Online (Sandbox Code Playgroud)
然后:
g++ -fdump-rtl-all test.cc
Run Code Online (Sandbox Code Playgroud)
这给我一堆文件.看一下(在我的例子中)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_)
Run Code Online (Sandbox Code Playgroud)
CLang编译器具有一个选项-emit-ast,用于转储用于表示已解析语言的抽象语法树.将表示模板的各种实例化.
AST在内存和xml版本中都有表示,因此您可以:
对于大多数代码检查(包括检查所选的重载),我发现实际上读取XML输出(以及通过它的浏览)足以满足我的需求.