在 C++ 中,对象指针有两种类型:其静态类型(在源代码中定义)和其动态类型( 对象进行类型转换之前的状况)。dbx 有时可以提供有关对象的动态类型的信息。
通常情况下,如果对象有虚拟函数表(即 vtable),dbx 便可使用 vtable 中的信息正确地确定对象的类型。
可以在 print 命令、display 命令或 watch 命令中使用 -r(递归)选项。此时 dbx 将显示通过类直接定义的所有数据成员以及从基类继承的所有数据成员。
在这些命令中还可使用 -d 或 +d 选项,用来切换 dbx 环境变量 output_derived_type 的缺省行为。
如果在没有运行进程时使用 -d 标志或将 dbx 环境变量 output_dynamic_type 设置为 on,将生成 "program is not active" 的错误消息,因为没有进程便无法访问动态信息。如果尝试通过虚拟继承来查找动态类型,将生成 "illegal cast on class pointers" 的错误消息。(在 C++ 中,从虚拟基类转换到派生类是非法的。)
C++ 允许使用未命名的参数来定义函数。例如:
void tester(int) { }; main(int, char **) { tester(1); }; |
虽然未命名参数不能在程序中的其他地方使用,但是编译器会按某种格式对未命名参数进行编码,让您可以对其求值。该格式如下(这里,编译器为 %n 赋整数值):
_ARG%n |
要获取由编译器分配的函数名称,请键入 whatis 命令,并用函数名称作为其目标。
(dbx) whatis tester void tester(int _ARG1); (dbx) whatis main int main(int _ARG1, char **_ARG2); |
有关更多信息,请参见whatis 命令。
要对未命名的函数参数求值(或显示未命名的函数参数),请键入:
(dbx) print _ARG1 _ARG1 = 4 |