如何扩展/“预处理”C ++模板代码

时间:2011-03-04 12:44:24

标签: c++ templates c-preprocessor

要在C ++中正确调试复杂的宏,我通常会对它们运行预处理器,以便准确查看生成的代码的样子。

是否有类似的方法来“预处理”模板代码?

3 个答案:

答案 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输出
  • 解析它,然后生成一些C ++代码
  • 创建一个重写器工具(直接在CLang中支持)并使用AST本身

对于大多数代码检查(包括检查所选的重载),我发现实际读取XML输出(以及通过它进行浏览)足以满足我的需求。

答案 2 :(得分:1)

这是一个相当古老的问题,但我认为这个领域已经有了很大的改进,但尚未广为人知。

Metashell可以像一种gdb一样用于模板实例化。这(据我所知)建立在clang工具上。

enter image description here