gpt4 book ai didi

c++ - 如何防止编译器忽略我未显式实例化的类型?

转载 作者:可可西里 更新时间:2023-11-01 18:39:33 24 4
gpt4 key购买 nike

情况

这是一道调试题。我已经为标准库安装了 GDB pretty-print ,但我发现它们在很多情况下都无法正常工作。例如,使用以下声明调试一段代码:

std::map<int, int> foo;

我使用 -O0 -ggdb3 进行了编译,因此我预计检查 foo 不会有任何问题,如果我手动检查结构,我也不会遇到任何问题。但是,STL pretty-print 不起作用,因为 GCC 似乎忽略了有关我的程序未显式实例化的嵌套类型的类型信息。

例如,如果我在 GDB 中运行以下命令:

p foo.begin()

我看到以下错误消息:

Python Exception <class 'gdb.error'> No type named
std::_Rb_tree_iterator<std::pair<int const, int> >::_Link_type.

这个缺失的类型名是一个内部类型定义,在 std::map::iterator 中定义。它是依赖于实现的标准库支持代码,因此它不是跨平台的(甚至保证在同一平台上的不同版本的实现之间继续存在)。

但是,如果我在程序中声明涉及该类型的内容, pretty-print 将正常工作。

std::_Rb_tree_iterator<std::pair<int const, int> >
::_Link_type *dummy = NULL;

问题

那么,在这种情况下,我如何指示 GCC 不要删除类型的定义,以便它们对调试器保持可用?鉴于 STL 实现不是跨平台的,像用预处理器宏声明一堆虚拟变量这样的变通方法似乎不是可扩展的解决方案。是否有一个标志可以传递给 GCC 以强制递归包含模板类型?或者 GCC 根本不支持这个?有没有其他人遇到过这个问题并解决了它?

作者注

GDB pretty-print 在 GDB 7.7.1(截至撰写本文时 ubuntu 14.04 存储库中的最新版本)中已损坏,无法正确打印指针。那些想回答这个问题的人可能会发现了解这是一个已知问题并且已经提交了错误很有用。

最佳答案

So, how do I instruct GCC not to remove the definitions for types in situations such as this, so they remain available to the debugger?

我认为没有任何方法可以指示 GCC 为您的程序中不存在的类型发出调试信息。

然而,它是一个非常奇怪的程序,它实例化了 std::map,但从不使用它的任何使用迭代器的方法。

if I declare something involving that type in the program

应该没有必要这样做。只需调用 m.begin() 或在程序某处的映射上使用范围 for 循环就足以实例化迭代器类型。

关于c++ - 如何防止编译器忽略我未显式实例化的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com