4

这里有一个代码来演示一个恼人的问题:

class A {
public:
    A():
        m_b(1),
        m_a(2)
        {}
private:
    int m_a;
    int m_b;
};

这是控制台视图的输出:

make all 
Building file: ../test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"test.d" -MT"test.d" -o"test.o" "../test.cpp"
../test.cpp: In constructor 'A::A()':
../test.cpp:9: warning: 'A::m_b' will be initialized after
../test.cpp:8: warning:   'int A::m_a'
../test.cpp:3: warning:   when initialized here
Finished building: ../test.cpp

问题在于,在“问题”视图中,我将看到 3 个单独的警告(输出中包含警告词的行),而输出中确实有 4 行描述了一个问题。

有什么我想念的吗?

附加问题。也许它是 Eclipse 精神,但有没有办法让控制台视图像大多数 IDE 一样可点击(例如 Visual Studio、emacs ...)

谢谢迪玛

4

5 回答 5

6

警告中有多行,因为每行引用不同的代码行。被警告的问题是在第 9 行声明的发生了什么,这是因为在第 8 行之前声明了is,但它是由从第 3 行开始的初始化列表中发生的事情引起的。m_bm_am_b

使用 gcc,彼此不相关的警告可能一个接一个地出现(即,一堆不相关的东西都错了main),因此 Eclipse 无法从输出中判断这些是单独的警告还是所有相关的同一个问题。

于 2009-08-02T13:44:41.060 回答
1

根据错误报告的最后一条评论,您应该能够单击控制台视图以跳转到 CDT 7.0 中的代码。

可能值得检查里程碑构建以查看错误消息的分组是否更好。如果不引发错误以尝试对相关消息进行分组将是一个好主意。

于 2010-02-28T18:38:28.730 回答
0

字段按照它们在类中声明的顺序进行初始化。编译器通过告诉您构造函数正在以错误的顺序进行初始化来帮助您。如果初始化的顺序很重要,这可能会导致奇怪的错误。

于 2009-11-03T10:18:23.427 回答
0

谢谢大卫,但我想你可能误解了我的意思。我指的是 Eclipse 中的“问题”视图默认按字母顺序对编译器错误进行排序。正如 Dima 所说,这会导致 gcc 错误消息出现问题,这些错误消息分布在两行中,例如

  1. 错误:“某某”受到保护
  2. 在这种情况下

因为所有“在此上下文中”行都与它们所指的变量分开。

但是,我刚刚找到了更改编译器错误排序顺序的选项,视图顶部的小向下三角形(刚刚发现这是您设置视图选项的地方,因为我是 Eclipse 新手) . 如果你玩这个,它会有所帮助,但仍然无法阻止同一个文件中的错误被弄乱(为什么没有一个选项让它们保持原样?)

于 2009-11-03T12:02:57.413 回答
0

我想这是因为 CDT 仍然有点不成熟,并且可能无法以最佳方式解析 g++ 输出。行../test.cpp: In constructor 'A::A()':不包含行号,因此 CDT 无法在test.cpp编辑器中放置错误标记,并且可能此问题会影响问题视图。

问题视图有更多麻烦。例如,您只能从视图中删除可见的错误,因此如果您获得的项目超过默认的 100 个,则必须逐个逐个删除它。如果在独立头文件中发生错误,清理后也不会自动删除错误。请放纵一下,他们正在从一个版本到另一个版本改进 CDT。

附加问题 - “使控制台视图可点击”是什么意思?

于 2010-03-01T23:45:24.173 回答