Eclipse CDT中生成结果和问题视图之间的差异

Eclipse CDT中生成结果和问题视图之间的差异,eclipse,eclipse-cdt,Eclipse,Eclipse Cdt,我正在Windows机器上使用Eclipse4.2、CDT和MinGW工具链(尽管我感觉问题与此特定配置无关)。G++编译器是4.7 我正在使用c++11功能,代码如下: #include <iostream> #include <iomanip> #include <memory> #include <vector> #include <list> #include <algorithm> using namespace

我正在Windows机器上使用Eclipse4.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;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
向量v{1,2,3,4,5,6,7};
int x{5};
自动标记=如果(v.begin(),v.end(),[x](int n){返回n个其他标志:
我添加了-std=c++11
  • 属性->C/C++构建->发现选项->编译器调用参数:
    添加-std=c++11
  • 这是我对全局首选项或项目属性所做的唯一更改

    第一个问题:为什么我必须在两个地方更改标志?当使用每个编译器标志时

    如果我点击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标志。然而,在remove\u if行上,CodAn会发出吠声:

    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;
    }
    
    intpred(intn){返回n<5;}
    int main(int argc,char*argv[])
    {
    向量v;
    对于(int i=0;i
    
  • 生成/设置-这些标志将包含在生成文件中以进行实际生成。生成/发现-当IDE发现“扫描仪设置”时,这些标志将传递给编译器。IDE将以特殊模式运行编译器,以发现预定义宏的值,包括路径等

  • 我相信,您看到的问题是由“Codan”检测到的。Codan是CDT编辑器中内置的静态分析,您可以在“C/C++常规”/“代码分析”中找到它的设置。如果您觉得显示的错误是假的,您应该向bugs.eclipse.org报告该问题。请注意,CDT还不支持所有C++11功能。

    谢谢@Eugene。上面的编辑问题中有一个后续问题。Codan是一个用Java构建的工具。eclipse Juno介绍了一种将外部工具与Codan()集成的方法.我不知道Codan是不是从外面跑来的。