如何扩展/“预处理”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立在铛工具。