perbedaan antara hasil build dan tampilan Masalah di Eclipse CDT

Saya menggunakan Eclipse 4.2, dengan CDT, dan toolchain MinGW pada mesin Windows (meskipun saya merasa masalahnya tidak ada hubungannya dengan konfigurasi khusus ini). Kompiler G++ adalah 4.7

Saya bermain dengan fitur c++11, dengan kode berikut:

#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;
}

Semuanya sangat mudah dan idiomatis c++11. Kode dikompilasi tanpa masalah pada baris perintah (g++ -std=c++11 hello.cpp).
Untuk membuat kode ini dikompilasi di Eclipse, saya mengatur kompiler untuk mendukung C++11:

  1. Properti -> C/C++ Build -> Pengaturan -> Miscellaneous -> Ohter Flags:
    Saya menambahkan -std=c++11
  2. Properti -> C/C++ Build -> Opsi Penemuan -> Argumen pemanggilan kompiler:
    Menambahkan -std=c++11

Itulah satu-satunya perubahan yang saya lakukan pada preferensi global atau properti proyek.

Pertanyaan Pertama: Mengapa saya harus mengganti bendera di dua tempat? Kapan setiap flag kompiler digunakan?

Jika saya menekan Ctrl-B, proyek akan berhasil dibangun, seperti yang diharapkan, dan menjalankannya dari dalam Eclipse menunjukkan hasil yang diharapkan (Dicetak: '5, 6, 7,').

Namun, tampilan editor menunjukkan tanda kesalahan berwarna merah pada baris 'remove_if' dan baris 'v.erase'. Demikian pula, tampilan Masalah menunjukkan saya mempunyai dua masalah ini. Melihat detail masalahnya, saya mendapatkan:

  • Untuk baris delete_if: 'Argumen tidak valid. Kandidatnya adalah: #0 hapus_if(#0, #0, #1)
  • Untuk baris hapus: 'Argumen yang tidak valid Kandidat adalah: '? menghapus(?), ? menghapus(?,?)'

Pertanyaan kedua: Tampaknya ada dua build berbeda: satu untuk status lanjutan, dan satu lagi untuk build sebenarnya. Apakah itu benar? Jika ya, apakah mereka memiliki aturan yang berbeda (bendera kompilasi, jalur penyertaan, dll.)?

Pertanyaan ketiga: Dalam detail masalah saya juga melihat: 'Masalah resolusi nama ditemukan oleh pengindeks'. Saya kira inilah sebabnya pesan kesalahannya sangat samar. Apakah pesan-pesan itu berasal dari kompiler MinGW g++ atau dari Eclipse? Apa resolusi Nama ini? Bagaimana cara memperbaikinya?

Hargai bantuan Anda.

EDIT (sebagai balasan ke @Eugene): Terima kasih Eugene. Saya telah membuka bug di Eclipse. Saya pikir C++11 hanya sebagian yang harus disalahkan. Saya telah membersihkan kode saya dari hal-hal C++11, dan menghapus flag -std=c++11 dari kedua saklar kompilasi. Namun, CodAn menggonggong pada baris delete_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;
}

Kode dikompilasi dengan baik (dengan Ctrl-B), tetapi CodAn tidak menyukai baris hapus_if, mengatakan: Argumen Tidak Valid, Kandidat adalah '#0 hapus_if(#0,#0,#1)'. Ini adalah pesan yang sangat samar - tampaknya pesan tersebut gagal menggantikan argumen dalam format string (#0 untuk 'iterator' dan #1 untuk 'predikat'). Saya akan memperbarui bugnya.

Menariknya, menggunakan 'daftar' dan bukan 'vektor' akan menghilangkan kesalahan tersebut.

Namun, untuk pertanyaan saya, saya penasaran bagaimana cara kerja CodAn. Apakah ia menggunakan g++ (dengan serangkaian tanda yang disesuaikan), atau alat eksternal lainnya (lint?), atau melakukannya secara internal di Java? Jika ada alatnya, bagaimana saya bisa mendapatkan argumen baris perintahnya, dan hasilnya?


person Uri    schedule 14.09.2012    source sumber
comment
Codan adalah alat yang dibangun di Java. Eclipse Juno memperkenalkan cara untuk mengintegrasikan alat eksternal dengan Codan (ibm.com/developerworks /java/library/j-codan). Saya tidak tahu apakah Codan mungkin dijalankan dari luar.   -  person Eugene    schedule 19.09.2012


Jawaban (1)


  1. Build/Settings - flag ini akan dimasukkan ke dalam makefile Anda untuk melakukan build sebenarnya. Build/Discovery - tanda ini akan diteruskan ke kompiler ketika "pengaturan pemindai" ditemukan oleh IDE. IDE akan menjalankan kompiler dalam mode khusus untuk menemukan nilai makro yang telah ditentukan sebelumnya, menyertakan jalur, dll.

Saya yakin, masalah yang Anda lihat terdeteksi oleh "Codan". Codan adalah analisis statis yang dibangun ke dalam editor CDT, Anda dapat menemukan pengaturannya di "C/C++ General"/"Code Analysis". Anda harus melaporkan masalah tersebut ke bug.eclipse.org jika Anda merasa kesalahan yang ditampilkan adalah palsu. Perhatikan bahwa CDT belum mendukung semua fitur C++11.

person Eugene    schedule 14.09.2012
comment
Terima kasih @Eugene. Pertanyaan lanjutan di atas, dalam pertanyaan EDIT. - person Uri; 19.09.2012