2

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. プロパティ -> C/C++ ビルド -> 設定 -> その他 -> その他のフラグ:
    -std=c++11 を追加しています
  2. プロパティ -> C/C++Build -> 検出オプション -> コンパイラ呼び出し引数:
    -std=c++11 を追加

これが、グローバル設定またはプロジェクト プロパティに対して行った唯一の変更です。

最初の質問:なぜ 2 つの場所でフラグを変更する必要があるのですか? 各コンパイラ フラグはいつ使用されますか?

Ctrl-B を押すと、プロジェクトは予想どおり正常にビルドされ、Eclipse 内から実行すると、予想される結果が表示されます (出力: '5, 6, 7,')。

ただし、エディター ビューでは、「remove_if」行と「v.erase」行の両方に赤いエラー マークが表示されます。同様に、[問題] ビューには、これら 2 つの問題があることが示されます。問題の詳細を見ると、次のようになります。

  • remove_if 行の場合: '引数が無効です。候補は: #0 remove_if(#0, #0, #1)
  • 消去行の場合: '無効な引数候補は次のとおりです: '? 消去(?)、?消去(?,?)'

2 番目の質問: 2 つの異なるビルドがあるようです。1 つは継続ステータス用で、もう 1 つは実際のビルド用です。そうですか?もしそうなら、それらには異なるルールがありますか (コンパイル フラグ、インクルード パスなど)?

3 番目の質問: 問題の詳細に、「インデクサーによって名前解決の問題が見つかりました」というメッセージも表示されます。これが、エラーメッセージが非常に不可解な理由だと思います。これらのメッセージは MinGW g++ コンパイラからのものですか、それとも Eclipse からのものですか? この名前解決とは何ですか? どうすれば修正できますか?

あなたの助けに感謝。

EDIT(@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)' . これは非常に難解なメッセージです - フォーマット文字列の引数を置換するのに失敗しているようです ('iterator' の場合は #0、'predicate' の場合は #1)。バグを更新します。

興味深いことに、'vector' の代わりに 'list' を使用すると、エラーが解消されます。

しかし、私の質問に関しては、CodAn がどのように機能するかについて興味があります。g++ (カスタマイズされたフラグ セットを使用)、または別の外部ツール (lint?) を使用しますか、それとも Java で内部的に実行しますか? ツールがある場合、そのコマンド ライン引数とその出力を取得するにはどうすればよいですか?

4

1 に答える 1

3
  1. ビルド/設定 - これらのフラグは、実際のビルドを行うためにメイクファイルに含まれます。Build/Discovery - これらのフラグは、「スキャナー設定」が IDE によって検出されたときにコンパイラに渡されます。IDE は特別なモードでコンパイラを実行して、事前定義されたマクロの値、インクルード パスなどを検出します。

あなたが見ている問題は「Codan」によって検出されると思います。Codan は CDT エディターに組み込まれた静的解析であり、「C/C++ 一般」/「コード解析」でその設定を見つけることができます。表示されたエラーが偽物だと思われる場合は、bugs.eclipse.org に問題を報告してください。CDT はまだすべての C++11 機能をサポートしていないことに注意してください。

于 2012-09-14T16:13:09.947 に答える