用于在应用程序中显示 Class 个对象的 C++ 代码分析器
C++ Code Analyzer for displaying Class objects in an App
我想开发一个可以打开 Visual Studio 项目并显示项目中所有 类 的应用程序。它只会读取头文件来查找 类.
我花了很长时间来解析每个数据成员和每个方法以正确显示。
所以我想知道是否有某种 API 或库可以用来解析 C++ 头文件的所有细节,以便显示它们。
编辑:
这就是我的应用程序目前的样子。我目前在获取用户定义类型时遇到问题,这就是为什么您会看到几个未命名的 Int32 类型。
App Preview
谁都希望解析源码很简单,C++也不例外。 It is not.
如果你想准确解析 C++ (header) 文件,你需要一个完整的 C++ 解析器。事实上,解析 header 文件,尤其是来自供应商(例如,Microsoft 甚至 GNU 的)的文件特别令人讨厌,因为它们往往包含特定于编译器的未记录的构造。
这里只有4个不错的选择:
The GNU compiler. It obviously can read GCC header files. I doubt it can read MS header files because of the vendor-specific extenstions. GCC really, really, wants to be a compiler and will resist your attempts to bend it to other tasks. Melt 是一个 GCC 扩展,试图使这更容易;我看过了,好像也没有好多少,但是我有偏见
Clang。它有一个完整的 C++ 解析器,专门处理 GCC-style 源文件。我不知道它能对 MS 特定构造做什么,更不用说 MS headers 了。 Clang 至少经过组织,可以让您将其用于自定义任务。 (显然 VS2015 包含 Clang 的副本以支持 Intellisense,但您无法获取它收集的信息)。
EDG。这是一个商业前端。它有一个完整的解析器,旨在让您围绕它构建工具。我不知道它对 MS 或 GNU headers 有何作用。 AFAIK,它不提供前端以外的任何东西。 (很多)。
(我们的)广告DMS Software Reengineering Toolkit with its C++ front end。 (我显然对此了解很多)。它有一个完整的 C++14 解析器,可以处理 GCC 和 MS header 文件。我们的前端是唯一尝试保留预处理器指令的前端,如果这对您很重要的话。 DMS 旨在让您围绕它构建工具。 DMS 为模式匹配和代码转换提供了大量支持 "just parsing"。解析后,每个class的信息在C++的符号table中可用;很容易列举出他们和他们的成员,以及他们与其他 classes 的关系。
无论您使用什么 C++ 解析技术,"its very complex",不要指望处理 C++ 会很容易。并且,要理解上述任何框架都需要很高的学习曲线。如果您进行投资,并继续构建一个真正的工具,您将学到很多东西,并准备好以更少的努力构建下一个更复杂的工具。
如果您不关心准确性,您可以使用 Perl 和正则表达式扫描文件以寻找 class 声明。这可能会导致工具无用。
我想开发一个可以打开 Visual Studio 项目并显示项目中所有 类 的应用程序。它只会读取头文件来查找 类.
我花了很长时间来解析每个数据成员和每个方法以正确显示。
所以我想知道是否有某种 API 或库可以用来解析 C++ 头文件的所有细节,以便显示它们。
编辑: 这就是我的应用程序目前的样子。我目前在获取用户定义类型时遇到问题,这就是为什么您会看到几个未命名的 Int32 类型。 App Preview
谁都希望解析源码很简单,C++也不例外。 It is not.
如果你想准确解析 C++ (header) 文件,你需要一个完整的 C++ 解析器。事实上,解析 header 文件,尤其是来自供应商(例如,Microsoft 甚至 GNU 的)的文件特别令人讨厌,因为它们往往包含特定于编译器的未记录的构造。
这里只有4个不错的选择:
The GNU compiler. It obviously can read GCC header files. I doubt it can read MS header files because of the vendor-specific extenstions. GCC really, really, wants to be a compiler and will resist your attempts to bend it to other tasks. Melt 是一个 GCC 扩展,试图使这更容易;我看过了,好像也没有好多少,但是我有偏见
Clang。它有一个完整的 C++ 解析器,专门处理 GCC-style 源文件。我不知道它能对 MS 特定构造做什么,更不用说 MS headers 了。 Clang 至少经过组织,可以让您将其用于自定义任务。 (显然 VS2015 包含 Clang 的副本以支持 Intellisense,但您无法获取它收集的信息)。
EDG。这是一个商业前端。它有一个完整的解析器,旨在让您围绕它构建工具。我不知道它对 MS 或 GNU headers 有何作用。 AFAIK,它不提供前端以外的任何东西。 (很多)。
(我们的)广告DMS Software Reengineering Toolkit with its C++ front end。 (我显然对此了解很多)。它有一个完整的 C++14 解析器,可以处理 GCC 和 MS header 文件。我们的前端是唯一尝试保留预处理器指令的前端,如果这对您很重要的话。 DMS 旨在让您围绕它构建工具。 DMS 为模式匹配和代码转换提供了大量支持 "just parsing"。解析后,每个class的信息在C++的符号table中可用;很容易列举出他们和他们的成员,以及他们与其他 classes 的关系。
无论您使用什么 C++ 解析技术,"its very complex",不要指望处理 C++ 会很容易。并且,要理解上述任何框架都需要很高的学习曲线。如果您进行投资,并继续构建一个真正的工具,您将学到很多东西,并准备好以更少的努力构建下一个更复杂的工具。
如果您不关心准确性,您可以使用 Perl 和正则表达式扫描文件以寻找 class 声明。这可能会导致工具无用。