【问题标题】:"Call Stack" for C++ errors in Visual Studio 2005Visual Studio 2005 中 C++ 错误的“调用堆栈”
【发布时间】:2010-11-09 17:52:33
【问题描述】:

Visual Studio 2005 (C++) 中是否有针对编译器错误的“调用堆栈”?

例如,我使用 boost::scoped_ptr 作为 QHash 中的值。然而,这会导致以下编译错误:

1>c:\qt\include\qtcore\../../src/corelib/tools/qhash.h(743) : error C2248: 'boost::scoped_ptr<T>::operator =' : cannot access private member declared in class 'boost::scoped_ptr<T>'

从构建输出中,我知道我的哪个源文件导致错误以及导致错误的 qhash.h 中的行号,但我正在尝试追踪 my中的行号> 产生错误的源文件(因此是“调用堆栈”的想法)。

请注意,我不是在寻找在 QHash 中使用 scoped_ptr 问题的解决方案,而是在寻找编译错误生成位置的问题。这对于帮助追踪奇怪的警告也很有用。在使用模板类时,我经常会遇到这个问题。

谢谢!

【问题讨论】:

  • 很好,你标记了你的问题visual-studio......否则我敢声称g++错误更容易阅读,并且经常更有效地引导你找到实际错误......跨度>
  • 我想这是设置 gcc 环境并在那里重新编译所有内容的一种解决方案(尽管相当乏味)。对于较小的项目,我肯定会尝试。
  • 一旦你习惯了它们,VC++ 就不会那么糟糕了。但我确实同意一般 g++ 有更好的错误消息。真正的问题是,您必须首先了解编译器试图做什么才能了解​​它的故障模式。
  • 我会对更新​​的 VS 版本有所改变吗? (如果今天有答案)

标签: visual-studio visual-c++ visual-studio-2005 compiler-errors compiler-warnings


【解决方案1】:

有时会出现奇怪的错误,它有助于预处理文件并查看该输出。使用 VS 在预处理器设置下查找“生成预处理文件”(或设置 /P 开关)。这将从 XXX.cpp 生成 XXX.i,这可能会帮助您找出问题所在。

确保关闭开关后,打开此选项不会生成 obj 文件。

【讨论】:

  • 我刚刚有机会检查一下。我知道是哪条线路导致了问题,但 /P 开关并没有帮助解决这个问题。好主意。
【解决方案2】:

这些类型的错误很难追踪。通常我最终会注释掉代码并找到有问题的行并从那里开始工作。这样做一段时间后,您将学会更好地阅读错误消息并了解导致编译器出错的原因。就目前而言,编译器错误消息太可怕了。

在这种情况下,它表示您有一个 boost::scoped_ptr&lt;T&gt; 类型的对象,它试图复制但该类不允许您(operator= 和复制 ctor 都被隐藏)。所以你需要看看这个类是如何使用的,看看它为什么试图复制它。也许scoped_ptr 不是您需要的。也许您需要shared_ptr

【讨论】:

    【解决方案3】:

    如果您查看构建输出,您应该会看到发生此错误时正在编译哪个项目和哪个 .cpp 文件。

    这里实际上没有“调用堆栈”的概念,因为编译器一次处理一个源文件。您的头文件中有编译器错误,因此您需要找出正在编译的包含该头文件的源文件。

    【讨论】:

    • 我没有修改你,但我确实更新了我的问题,以便更具体地说明我在寻找什么。
    • -1:一次考虑单个编译单元这一事实并不能阻止编译器知道被指控的调用来自何处。这种错误通常是由比编译器报告的行更高级别的东西引起的。
    • 在这种情况下,导致此错误的源文件中的行将是使用 scoped_ptr 声明 QHash 实例的行。这就是模板的问题。 scoped_ptr 必须违反 QHash 对其模板参数的假设。
    猜你喜欢
    • 2010-09-11
    • 2011-06-21
    • 1970-01-01
    • 2013-09-27
    • 2012-01-03
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多