eclipse - Eclipse CDT 中构建结果和问题 View 之间的差异

标签 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. Properties -> C/C++ Build -> Settings -> Miscellaneous -> Ohter Flags:
    我正在添加 -std=c++11
  2. 属性 -> C/C++Build -> 发现选项 -> 编译器调用参数:
    添加-std=c++11

这是我对全局首选项或项目属性所做的唯一更改。

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

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

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

  • 对于 remove_if 行:'无效参数。候选人是:#0 remove_if(#0, #0, #1)
  • 对于删除行:'Invalid arguments Candidates are: '?删除(?),?删除(?,?)'

第二个问题:似乎有两种不同的构建:一种用于继续状态,一种用于实际构建。是对的吗?如果是这样,它们是否有不同的规则(编译标志、包含路径等)?

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

感谢您的帮助。

编辑(回复@Eugene):谢谢 Eugene。我在 Eclipse 上打开了一个错误。我认为 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 行,它说:Invalid Arguments, Candidates are '#0 remove_if(#0,#0,#1)' 。 这是一条非常神秘的消息——它似乎没有替换格式字符串中的参数(#0 代表“迭代器”,#1 代表“谓词”)。我要更新错误。

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

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

最佳答案

  1. Build/Settings - 这些标志将包含在您的 makefile 中以进行实际构建。构建/发现 - 当 IDE 发现“扫描器设置”时,这些标志将传递给编译器。 IDE 将以特殊模式运行编译器以发现预定义宏的值、包含路径等。

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

关于eclipse - Eclipse CDT 中构建结果和问题 View 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17117226/

相关文章:

c++ - Eclipse Indigo CDT 代码完成

c - 程序运行但要求输入两次

android - 如何强制 Eclipse 重新启动未更改的应用程序

android - 为什么eclipse一直高亮某个方法?

java - 当对象需要在 try/catch block 中时,IDE 的 "know"如何处理?

c++ - eclipse-cdt如何与静态库链接

c - 在 (Eclipse CDT) autotools 项目中添加 CFLAG(例如 -std=gnu99)的位置

java - 为什么 JavaFX 不包含在 Ubuntu Wily (15.10) 上的 OpenJDK 8 中?

Eclipse 生成的 Javadoc ${date} 格式

c++ - Qt 4.7 在 Windows 上使用 Eclipse?