c++ - Dir ( python ) 类似于 C++ 中的实用程序

标签 c++ gdb

<分区>

Possible Duplicate:
How can I add reflection to a C++ application?

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

最佳答案

C++ 不提供实现此目的的内置机制。 the discussion Keith Randall pointed out 中似乎很好地涵盖了这个主题.

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 - 接口(interface)定义语言)定义,中间件工具通过解析类的 IDL 描述生成 C++ 类定义。这样做的目的之一是允许生成的代码理解如何打包该类型的对象,将其传送到另一台机器,在该机器上解压缩,并让该机器上的软件使用该对象。

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

关于c++ - Dir ( python ) 类似于 C++ 中的实用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10958436/

相关文章:

c++ - 什么是三法则?

python - gdb python模块读取内存内容

c++ - 如何读取 gdb 中的内存地址以进行 i7 处理器代码反汇编?

c - 当我使用 gdb 调试 C 程序并键入 'p system' 时,我到底得到了什么?

c++ - OpenGL:gluUnProject 的结果不是预期的结果

c++ - 单击按钮时运行功能

C++。我试图通过在开关中使用数组来获取用户输入,但是当我运行代码时它显示段错误?

c++ - GDB 在对象函数调用时中断

c++ - 为什么 gdb 会在断点处自动继续?

python - eclipse : debug shared library loaded from python