【问题标题】:Generate C++ code where templates have been expanded生成已扩展模板的 C++ 代码
【发布时间】:2015-10-20 10:15:49
【问题描述】:
我想知道是否有一种方法可以使用 C++ 编译器来生成 C++ 代码,其中所有模板都已扩展为程序所需的实例化。这段代码在编译过程中一定存在,虽然默认情况下可能不是 ASCII 格式,但在我看来,将其转换回可读的 C++ 代码应该不会太难。
编辑:我最感兴趣的解决方案是生成实际的 C++ 代码(至少可以编译并且理想情况下也是可读的),而不仅仅是对实例化的类和函数的概述。这似乎是一个有用的功能,可以使复杂的模板化代码更具可读性(例如,用于调试),或者如果代码需要由常规 C++ 编译器以外的软件处理,后者可能不(完全)支持模板。
【问题讨论】:
标签:
c++
templates
compilation
【解决方案1】:
模板是语言的一部分,而不是一些预处理程序 - 它们由编译器处理,就像其他代码一样。
在 Visual Studio 2012 中无法执行此操作(属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理到文件 - 不会为您提供扩展模板)。
g++ 有一个bunch of debug options。我会尝试-fdump-class-hierarchy(未测试)。
【解决方案3】:
一种方法是在调试中编译您的程序,然后转储符号。所有编译的模板都必须定义它们的符号。
g++ -g foo.cpp -o foo.o
当然你会错过内联函数,但这可以通过
来抑制
g++ -g -fno-inline-functions foo.cpp -o foo.o
要获取符号,请使用:
objdump -t --demangle a.out