就像在python中一样,我们有dir()来列出对象的所有属性/函数/成员,C ++对象是否有办法获取gdb或其他实用程序中的所有成员?
答案 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 ++对象的信息。