有好的Python库可以解析C++吗?

62 投票
13 回答
43164 浏览
提问于 2025-04-15 14:25

谷歌搜索没有找到任何相关的信息。

我有一堆已经能正常工作的C++代码,我想用Python来分析这些代码,看看类与类之间的关系等等。

补充说明:我并不需要或者想要解析每一行C++代码;我只需要一个聪明点的工具,能识别出类、函数和成员变量的声明,并且跳过函数的具体定义。

13 个回答

7

多年来,我一直在使用 pygccxml,这是一个非常不错的Python工具,它是GCC-XML的一个封装。这个工具功能非常全面,是一些常用代码生成工具的基础,比如同一个作者开发的 py++

50

这不是一个直接的答案,而是想展示一下正确解析C++有多难。我最喜欢的例子是:

template<bool> struct a_t;

template<> struct a_t<true> {
    template<int> struct b {};
};

template<> struct a_t<false> {
    enum { b };
};

typedef a_t<sizeof(void*)==sizeof(int)> a;

enum { c, d };
int main() {
    a::b<c>d; // declaration or expression?
}

这段代码是完全有效的,符合标准的C++,但是注释行的具体含义取决于你使用的编程环境。如果 sizeof(void*)==sizeof(int)(在32位平台上通常是这样的),那么这行代码是在声明一个类型为 a::b<c> 的局部变量 d。如果这个条件不成立,那么它就是一个没有实际作用的表达式 ((a::b < c) > d)。如果你为 a::b 添加一个构造函数,实际上你就能通过有无副作用来区分这两种情况。

41

C++ 这种语言解析起来特别困难。很多尝试正确解析它的人,最后都不得不拆解一个编译器。实际上,这也是 LLVM 项目开始的部分原因:苹果需要一种方法,能够按照编译器解析 C++ 的方式,在 XCode 中解析 C++。

所以才会有像 GCC_XML 这样的项目,你可以把它和 Python 的 XML 库结合起来使用。

一些非编译器的项目,在解析 C++ 方面表现得相当不错,包括:

  • Eclipse CDT
  • OpenGrok
  • Doxygen

撰写回答