Eclipse CDT中构建结果与Problems视图之间的差异

时间:2012-09-14 09:47:29

标签: eclipse eclipse-cdt

我在Windows机器上使用Eclipse 4.2,CDT和MinGW工具链(虽然我觉得问题与此特定配置无关)。 G ++编译器是4.7

我正在使用c ++ 11功能,使用以下代码:

#include <iostream>
#include <iomanip>
#include <memory>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

int main( int argc, char* argv[] )
{
    vector<int> v { 1, 2, 3, 4, 5, 6, 7 };
    int x {5};
    auto mark = remove_if( v.begin(), v.end(), [x](int n) { return n<x; } );
    v.erase( mark, v.end() );
    for( int x : v ) { cout << x << ", "; }
    cout << endl;
}

一切都非常直接和惯用的c ++ 11。代码在命令行上编译没有问题(g ++ -std = c ++ 11 hello.cpp) 为了使这段代码在eclipse中编译,我将编译器设置为支持C ++ 11:

  1. 属性 - &gt; C / C ++ Build - &gt;设置 - &gt;其他 - &gt; Ohter Flags:
    我正在添加-std = c ++ 11
  2. 属性 - &gt; C / C ++ Build - &gt;发现选项 - &gt;编译器调用参数:
    添加-std = c ++ 11
  3. 这是我对全局首选项或项目属性所做的唯一更改。

    第一个问题:为什么我要在两个地方更改旗帜?何时使用每个编译器标志?

    如果按Ctrl-B,项目将按预期成功构建,并在eclipse中运行它显示预期结果(打印:'5,6,7,')。

    但是,编辑器视图在“remove_if”行和“v.erase”行上都显示错误的红色标记。同样,Problems视图显示我有这两个问题。看看问题的细节,我得到:

    • 对于remove_if行:'参数无效。候选人是:#0 remove_if(#0,#0,#1)
    • 对于擦除行:'无效参数候选者是:'?擦除(?),?擦除(?,?)'

    第二个问题:看起来有两种不同的构建:一种用于连续状态,另一种用于实际构建。是对的吗?如果是这样,他们是否有不同的规则(编译标志,包括路径等)?

    第三个问题:在问题详情中我还看到:“索引器找到的名称解析问题”。我想这就是错误信息如此神秘的原因。这些消息来自MinGW g ++编译器还是来自Eclipse?这个名称解析是什么?我该如何解决?

    感谢您的帮助。

    编辑(回复@Eugene):谢谢Eugene。我在Eclipse上打开了一个bug。我认为C ++ 11只是部分原因。我已经从C ++ 11中清除了我的代码,并从编译开关中删除了-std = c ++ 11标志。然而,CodAn在remove_if行上咆哮:

    int pred( int n ) { return n < 5; }
    
    int main( int argc, char* argv[] )
    {
        vector<int> v;
        for( int i=0; i<=7; ++i ) { 
            v.push_back( i );
        }
    
        vector<int>::iterator mark = remove_if( v.begin(), v.end(), pred );
        v.erase( mark, v.end() );
    
        for( vector<int>::iterator i = v.begin(); i != v.end(); ++i ) {
            cout << *i << ", ";
        }
        cout << endl;
    }
    

    代码编译得很好(使用Ctrl-B),但CodAn不喜欢remove_if行,说:无效的参数,候选者是'#0 remove_if(#0,#0,#1)' 的。 这是一个非常神秘的消息 - 它似乎错过了在格式字符串中替换参数(#0为'iterator'而#1为'谓词')。我要更新错误。

    有趣的是,使用'list'而不是'vector'可以清除错误。

    然而,至于我的问题,我很好奇CodAn是如何工作的。它是使用g ++(带有自定义标志集)还是其他外部工具(lint?),还是使用Java内部执行?如果有工具,我怎样才能得到它的命令行参数及其输出?

1 个答案:

答案 0 :(得分:3)

  1. 构建/设置 - 这些标志将包含在您的makefile中以进行实际构建。构建/发现 - 当IDE发现“扫描程序设置”时,这些标志将传递给编译器。 IDE将以特殊模式运行编译器以发现预定义宏,包括路径等的值。
  2. 我相信,你看到的问题是由“Codan”发现的。 Codan是CDT编辑器中内置的静态分析,您可以在“C / C ++ General”/“Code Analysis”中找到它的设置。如果您觉得显示的错误是假的,您应该将问题报告给bugs.eclipse.org。请注意,CDT尚不支持所有C ++ 11功能。