我使用 gdb 调试器来打印 ZZ 类型的变量的值。此数据类型在数论库或 NTL中定义。当我使用“print x”来找出我的变量的值时,我得到了这样的东西:
print x
$1 = {rep=0xab2cc54}.
我想这是我的 ZZ 对象的地址。我怎样才能打印它的价值?我应该提一下,我不知道这个类的内部表示。
我可以将 NTL 与 Eclipse 之类的编译器一起使用来更轻松地调试我的应用程序吗?
我可以将 NTL 与 Eclipse 之类的编译器一起使用吗?
首先:Eclipse 不是编译器,而是为您封装编译器和调试工具的 IDE。
在调试模式下,IDE 能够解析源代码中使用的实际类型和内部表示,并让您逐步完成。
也就是说,我很确定您可以使用 Eclipse CDT 来检查您的特定类型值。
……我的 ZZ 对象。我怎样才能打印它的价值?
这有点难看,但有效:
(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)(cerr, x)
42$1 = (std::ostream &) @0x620020: <incomplete type>
(在本例中,变量x
的值为42
)。
如果您不想在值之后出现垃圾,则可以转换为void
:
(gdb) call (void)NTL::operator<<(std::ostream&, NTL::ZZ const&)(cerr, x)
42(gdb)
(但请注意,值之后没有换行符)。
如果你不是using namespace std
,你可能不得不写
(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)('std::cerr', x)
有时cerr
可能不在范围内:
(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)(cerr, x)
No symbol "cerr" in current context.
- 然后你可以尝试使用cout
,但它变得更加丑陋,因为必须刷新缓冲的输出:
(gdb) call NTL::operator<<(std::ostream&, NTL::ZZ const&)(cout, x)
(gdb) call 'std::basic_ostream<char, std::char_traits<char>>& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char>>&, char const*)'(&cout, "\n")
42