【问题标题】:A gcc-xml equivalent / source parsing tool for MS VC++用于 MS VC++ 的 gcc-xml 等效/源解析工具
【发布时间】:2013-02-05 00:52:35
【问题描述】:

是否有gcc-xml等效或类似的Visual C++编译器工具,可以反映C++源代码的内部结构?

我的目标是通过使用 C++(本机 C++)源或头文件作为输入来生成输出,这样:

  1. 处理所有预处理器指令。 (这已经可以通过 /P、/E 或 /EP 编译器开关实现。)
  2. 所有typedefs 都扩展为它们的基本类型。
  3. 获取所有变量/函数/类/成员名称及其签名的列表。
  4. 可以选择获取所有实例化模板类的列表。

typedef 为例,这段代码:

typedef string my_type;
my_type s1;

扩展为:

std::basic_string<char, std::char_traits<char>, std::allocator<char> > s1;

或者可以让我做到这一点的东西。

我知道这可以通过使用 gcc-xml(使用 gcc 作为中间编译器)或a number of non-MSVC options 来实现。但是重要的要求是“编译全部由VC++完成”。

任何可以解决至少一个后续功能或指导我完成目标的解决方案或解决方法都值得赞赏。

【问题讨论】:

  • Visual C++ 编译器不通过任何公共接口公开其内部数据结构。
  • /Zg cl.exe 的开关提供了一个非常有用的扩展函数原型列表。但不幸的是,它仅适用于 C 源文件,因此忽略了类和成员函数。我找不到任何为类和/或typedefs 生成此类列表的类似开关。

标签: c++ parsing visual-c++ compiler-construction code-generation


【解决方案1】:

Semantic Designs(我的公司)提供了 DMS Software Reengineering Toolkit,带有用于各种 C++ 方言的 C++ 解析器,包括 MS Visual Studio。

DMS 并不是专门为生成您想要的数据而设计的,但它会很容易地生成它。 DMS by design 是一种可定制的实用工具,需要进行一些配置才能获得自定义答案。在您的情况下,您想要的几乎所有内容都可以在 DMS 的 C++ 符号表中使用,因此自定义将是“遍历符号表,格式化并提取您想要的内容”。有一套完整的 API 可以支持这样做(以及许多其他有用的程序分析/操作任务)。

【讨论】:

  • 拥有符号表或元数据来生成所需信息是可以的。但我猜你的 DMS 使用它自己的内部编译器。我说的对吗?
  • 这个想法是,如果 VC++ 遵循自己特定的语法,与其他 C++ 编译器不兼容,甚至不遵循标准,那也没关系。源代码生成也必须遵循相同的方案。例如。如果 C++ 源代码不符合标准但在 VC 下编译,则它是可接受的源文件,如果源代码符合标准但无法在 VC++ 下编译,则会被拒绝。
  • 现在假设用户已切换到行为略有不同的不同版本的 MS VC++(旧或新)。我们还必须遵循新的编译器规则。还要考虑未来版本的 VC++,可能会更广泛地覆盖 C++11。
  • 我会注意到,C++ 标准非常庞大且令人费解,MS 不太擅长记录他们所做的事情。因此,我们的前端在我们所知道的范围内(通过我们理解的文档 :) 或在实践中遇到的程度与 MS 相匹配。因此,我希望人们仍然能够找到暗角差异。当遇到差异时,我们会努力调整。我知道没有其他替代方案可以尝试跟踪 MS。
  • 我没有否决您的回答。不幸的是,它不能满足我的要求,但它已经足够接近我想要的了。
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 2010-11-10
  • 2018-09-08
  • 2011-02-07
  • 2017-09-08
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多