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

为了正确地debuggingC ++中的复杂macros,我通常在其上运行预处理程序,以便准确地查看结果代码的外观。

有没有类似的方式来“预处理”模板代码?

一种方式(依赖于编译器)是在每个编译器步骤之后使用转储。 我写了一个小程序:

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

我只有一半的屁股答案。

我不知道如何实际获取C ++源代码(已经存在),但是CLang编译器具有一个选项-emit-ast ,用于转储用于表示parsing语言的抽象语法树。 模板的各种实例将被表示。

AST既在内存中也在xml版本中表示,所以您可以:

  • 只需使用XML输出
  • parsing它,然后生成一些C ++代码
  • 创build一个重写器工具(直接在CLang中支持)并使用AST本身

对于大多数的代码检查(包括检查select的重载),我发现实际阅读XML输出(很好,通过它)足以满足我的需求。

这是一个相当古老的问题,但我认为在这方面已经有了显着的改进,但尚未广为人知。

Metashell可以像模板实例一样使用gdb。 这(据我所知)build立在铛工具。

在这里输入图像说明