Dir(蟒蛇)在C++中的实用程序

Dir ( python ) like utility in C++

本文关键字:实用程序 C++ 蟒蛇 Dir      更新时间:2023-10-16

可能的重复项:
如何向C++应用程序添加反射?

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

C++没有

提供实现此目的的内置机制。这个话题似乎在基思·兰德尔(Keith Randall)指出的讨论中得到了很好的涵盖。

gdb可以为您提供对象的数据成员,但您需要有一个要引用的对象实例,如果全局名称a,则需要执行print a。要查找方法,如果类名为 A,则应使用 info functions 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++对象的信息。