Dir(python)就像C ++中的实用程序一样

时间:2012-06-09 04:46:52

标签: c++ gdb

  

可能重复:
  How can I add reflection to a C++ application?

就像在python中一样,我们有dir()来列出对象的所有属性/函数/成员,C ++对象是否有办法获取gdb或其他实用程序中的所有成员?

1 个答案:

答案 0 :(得分:2)

C ++没有提供实现此功能的内置机制。 the discussion Keith Randall pointed out中已经很好地介绍了这个主题。

gdb可以为您提供对象的数据成员,但是您需要有一个要引用的对象的实例,并且如果全局的名称是{{print a,则执行a 1}}。要查找方法,如果类名为info functions A::*,则使用A。这将找不到内联函数(示例中注意baz_inline)。

class A {
public:
    void foo ();
    int bar (int);
    void baz_inline () {}
    double d;
    short p;
};
A a;
void A::foo () {}
int A::bar (int) { return 0; }
int main () {}

$ g++ -g c.cc
$ gdb a.out
(gdb) p a
$1 = {d = 0, p = 0}
(gdb) p &a.d
$2 = (double *) 0x600920
(gdb) p &a.p
$3 = (short *) 0x600928
(gdb) info functions A::*
All functions matching regular expression "A::*":

File c.cc:
int A::bar(int);
void A::foo();
(gdb) quit

最初,我在考虑中间件,因为有中间件技术可以部分地做你想要的。在那里,C ++类是用元语言(IDL - 接口定义语言)定义的,中间件工具通过解析类的IDL描述来生成C ++类定义。其中一个目的是允许生成代码,以便了解如何打包该类型的对象,将其交付给另一台机器,在该机器上解压缩,并让该机器上的软件使用该对象。

您没有描述过这样的需求,但是您需要类似的功能,因为您想了解C ++接口及其数据成员。既然你说python已经拥有了这个功能,我认为编写自己的小工具可能很容易,它使用python代码作为你的IDL。也就是说,您创建一个实际上想要成为C ++对象的python对象,并且您的工具使用dir()的结果生成C ++头文件来表示该对象。您可以查询对象的python版本(带有嵌入式python),以获取有关C ++对象的信息。