【问题标题】:Generate C++ code where templates have been expanded生成已扩展模板的 C++ 代码
【发布时间】:2015-10-20 10:15:49
【问题描述】:

我想知道是否有一种方法可以使用 C++ 编译器来生成 C++ 代码,其中所有模板都已扩展为程序所需的实例化。这段代码在编译过程中一定存在,虽然默认情况下可能不是 ASCII 格式,但在我看来,将其转换回可读的 C++ 代码应该不会太难。

编辑:我最感兴趣的解决方案是生成实际的 C++ 代码(至少可以编译并且理想情况下也是可读的),而不仅仅是对实例化的类和函数的概述。这似乎是一个有用的功能,可以使复杂的模板化代码更具可读性(例如,用于调试),或者如果代码需要由常规 C++ 编译器以外的软件处理,后者可能不(完全)支持模板。

【问题讨论】:

  • 看看this answer
  • 有反汇编,但无法转换为可读的C++。

标签: c++ templates compilation


【解决方案1】:

模板是语言的一部分,而不是一些预处理程序 - 它们由编译器处理,就像其他代码一样。

在 Visual Studio 2012 中无法执行此操作(属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理到文件 - 不会为您提供扩展模板)。

g++ 有一个bunch of debug options。我会尝试-fdump-class-hierarchy(未测试)。

【讨论】:

    【解决方案2】:

    我认为“模板”可能会有所帮助:Demo at CppCon2015Slides

    【讨论】:

      【解决方案3】:

      一种方法是在调试中编译您的程序,然后转储符号。所有编译的模板都必须定义它们的符号。

      g++ -g foo.cpp -o foo.o
      

      当然你会错过内联函数,但这可以通过

      来抑制
      g++ -g -fno-inline-functions foo.cpp -o foo.o
      

      要获取符号,请使用:

      objdump -t --demangle a.out
      

      【讨论】:

        猜你喜欢
        • 2020-05-29
        • 2010-12-20
        • 2011-05-08
        • 2012-08-20
        • 2012-03-27
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        • 2010-09-22
        相关资源
        最近更新 更多