可能重复:
如何向 C++ 应用程序添加反射?
就像在 python 中一样,我们有 dir() 来列出对象的所有属性/函数/成员,有没有办法让 C++ 对象在 gdb 或其他一些实用程序中获取所有成员?
可能重复:
如何向 C++ 应用程序添加反射?
就像在 python 中一样,我们有 dir() 来列出对象的所有属性/函数/成员,有没有办法让 C++ 对象在 gdb 或其他一些实用程序中获取所有成员?
C++ 没有提供实现这一点的内置机制。Keith Randall 指出的讨论似乎很好地涵盖了这个主题。
gdb
可以为您提供对象的数据成员,但您需要有一个对象实例来引用,并且print a
如果全局名称是a
. 要查找方法,您可以使用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++ 对象的信息。