c++ - 是否有工具可以将 C++ 中的源代码转换为 C/C++ 中的源代码,但使用实例化(展开)模板?

标签 c++

<分区>

是否有工具可以将 C++ 中的源代码转换为 C/C++ 中的源代码,但使用实例化(展开)模板? 这对于明确理解转换为 C++ 模板的代码是必要的。 它可能存在于 IDE(MSVS、QtCreator 等)或编译器(ICC、GCC、MSVC、Clang)中?

最佳答案

这似乎已经在 SO 上得到了回答

Alexey Frunze 使用反汇编代码的想法/原则非常好,再加上简化模板的使用,很有可能准确理解它的作用。

编辑 1 关于如何理解编译器所做的事情,还有一些其他的可能性

  1. 使用:gcc -S -O1 {yourcode.cpp} 获取程序集并使用工具 c++filt(它是 binutils 的一部分)如果您对 C 代码感觉更舒服,请将反汇编转换为 C 代码
  2. 使用:g++ -fdump-tree-original file.cpp 获取一些(伪)C++ 代码
  3. 在最后一次实例化之后使用带断点的 MSVC++ 调试器,查看作为实例化模板参数的所有类型和值
  4. 使用:GCC XML用于使用实例化模板生成 XML ( FAQ )
  5. 要了解编译器如何实例化和优化模板,您可以使用 Clang:-emit-llvm 获取 LLVM IR,并使用 llvm-dis 对其进行转换发短信
  6. CPP insights是一个基于 LLVM 的工具的网站,用于查看实例化

关于c++ - 是否有工具可以将 C++ 中的源代码转换为 C/C++ 中的源代码,但使用实例化(展开)模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15729585/

相关文章:

c++ - static_assert 检查非模板类的模板构造函数中的值

c++ - QMYSQL 驱动未加载 Qt 5.6 Linux Ubuntu 16.04

c++ - 为什么我的程序会跳过第一个函数? (初级 C++)

c++ - 如何在没有 "&"或 "*"的情况下为调用的方法提供正确的参数?

c++ - 线程本地获取/释放同步

c++ - 全局命名空间中的保留名称

c++ - 将属性传递给 OpenGL 顶点着色器的行为很奇怪

c++ - 这个 "if e is a pack, then get a template name, otherwise get a variable name"是否有效?

c++ - C++ 中的链接列表

c++ - 在分配指针后,您可以为指针所指向的对象分配一个变量名吗?