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:
- Properti -> C/C++ Build -> Pengaturan -> Miscellaneous -> Ohter Flags:
Saya menambahkan -std=c++11 - 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?