Catatan ini mengatakan:
-ansi
: memberi tahu kompilator untuk mengimplementasikan opsi bahasa ANSI. Tindakan ini mematikan "fitur" GCC tertentu yang tidak kompatibel dengan standar ANSI.
-pedantic
: digunakan bersama dengan-ansi
, ini memberi tahu kompiler untuk mematuhi standar ANSI secara ketat, menolak kode apa pun yang tidak sesuai.
Hal pertama yang pertama:
- Apa tujuan dari opsi
-pedantic
dan-ansi
dari kompiler GCC / G ++ (saya tidak dapat memahami deskripsi di atas)? - Adakah yang bisa memberi tahu saya keadaan yang tepat untuk menggunakan kedua opsi ini?
- Kapan saya harus menggunakannya?
- Apakah mereka penting?
Saya menggunakannya sepanjang waktu dalam pengkodean saya.
The
-ansi
bendera setara dengan-std=c89
. Seperti yang disebutkan, ini mematikan beberapa ekstensi GCC. Menambahkan akan-pedantic
mematikan lebih banyak ekstensi dan menghasilkan lebih banyak peringatan. Misalnya, jika Anda memiliki string literal lebih dari 509 karakter,-pedantic
peringatkan tentang itu karena melebihi batas minimum yang disyaratkan oleh standar C89. Artinya, setiap compiler C89 harus menerima string dengan panjang 509; mereka diizinkan untuk menerima lebih lama, tetapi jika Anda bertele-tele, tidak portabel untuk menggunakan string yang lebih panjang, meskipun kompiler diizinkan untuk menerima string yang lebih panjang dan, tanpa peringatan bertele-tele, GCC akan menerimanya juga.sumber
-std=c89 -pedantic
berarti Anda dapat berpindah dengan lebih mudah di antara kompiler yang berbeda di platform lain. Segera setelah Anda mulai menggunakan<windows.h>
, kompatibilitas dengan sistem lain menjadi bermasalah.-pedantic
, tetapi sebagian besar kode saya masih mengkompilasi OK ketika saya mengaktifkannya kembali (satu program yang tidak secara eksplisit menggunakan__int128
tipe, yang secara pedantically tidak benar). Saya pikir ada tahap intervensi ketika GCC terlalu berisik (untuk saya sukai)-pedantic
. Saya baru saja menguji sekitar 300 file sumber - beberapa kode pustaka, beberapa perintah, beberapa program uji SO - dan hanya ada satu masalah yang diharapkan. Saat ini menggunakan GCC 4.8.2 di Mac OS X 10.9.2.-ansi
adalah sebuah saklar usang yang meminta compiler untuk mengkompilasi sesuai dengan 30 tahun revisi usang dari standar C , ISO / IEC 9899: 1990 , yang pada dasarnya adalah rebranding dari ANSI standar X3.159-1989 "Pemrograman Bahasa C . Mengapa usang? Karena setelah C90 diterbitkan oleh ISO, ISO telah bertanggung jawab atas standardisasi C, dan setiap corrigenda teknis untuk C90 telah diterbitkan oleh ISO. Jadi lebih cenderung menggunakan-std=c90
.Tanpa sakelar ini, compiler GCC C terbaru akan sesuai dengan bahasa C yang distandarisasi dalam ISO / IEC 9899: 2011 , atau revisi terbaru 2018.
Sayangnya ada beberapa vendor compiler malas yang percaya bahwa dapat diterima untuk tetap menggunakan revisi standar lama yang sudah usang, di mana dokumen standardisasi bahkan tidak tersedia dari badan standar.
Menggunakan sakelar membantu memastikan bahwa kode harus dikompilasi di kompiler usang ini.
Ini
-pedantic
yang menarik. Jika tidak ada-pedantic
, meskipun standar tertentu diminta, GCC akan tetap mengizinkan beberapa ekstensi yang tidak dapat diterima dalam standar C. Pertimbangkan misalnya programstruct test { int zero_size_array[0]; };
The C11 rancangan n1570 ayat 6.7.6.2p1 mengatakan :
Standar C mengharuskan panjang array lebih besar dari nol; dan paragraf ini ada dalam batasan ; standar mengatakan 5.1.1.3p1 berikut :
Namun, jika Anda mengkompilasi program dengan
gcc -c -std=c90 pedantic_test.c
, tidak ada peringatan yang dihasilkan.-pedantic
menyebabkan kompilator benar-benar memenuhi standar C ; jadi sekarang ini akan menghasilkan pesan diagnostik, seperti yang disyaratkan oleh standar:gcc -c -pedantic -std=c90 pedantic_test.c pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic] int zero_size_array[0]; ^~~~~~~~~~~~~~~
Jadi, untuk portabilitas maksimal, menentukan revisi standar saja tidak cukup, Anda juga harus menggunakan
-pedantic
(atau-pedantic-errors
) untuk memastikan bahwa GCC benar-benar sesuai dengan standar yang berlaku.Bagian terakhir dari pertanyaan itu adalah tentang penggunaan
-ansi
dengan C ++ . ANSI tidak pernah menstandarkan bahasa C ++ - hanya mengadopsinya dari ISO, jadi ini sama masuk akal dengan mengatakan "Bahasa Inggris seperti yang distandarkan oleh Prancis". Namun GCC tampaknya masih menerimanya untuk C ++, kedengarannya bodoh.sumber
-std=c11 -Wall -Wextra -Wpedantic -Wconversion
.Pada dasarnya, ini akan membuat kode Anda jauh lebih mudah untuk dikompilasi di bawah kompiler lain yang juga menerapkan standar ANSI, dan, jika Anda berhati-hati dengan panggilan libraries / api yang Anda gunakan, di bawah sistem operasi / platform lain.
Yang pertama, mematikan fitur KHUSUS GCC. (-ansi) Yang kedua, akan mengeluh tentang APA SAJA yang tidak sesuai dengan standar (tidak hanya fitur khusus GCC, tetapi juga konstruksi Anda.) (-pedantic).
sumber
Jika kode Anda harus portabel, Anda dapat menguji apakah kode tersebut dikompilasi tanpa ekstensi gcc atau fitur non-standar lainnya. Jika kode Anda dikompilasi dengan
-pedantic -ansi
maka dalam teori itu harus mengkompilasi OK dengan kompiler standar ANSI lainnya.sumber
-pedantic
tidak mematikan semua ekstensi, ia meninggalkan banyak hal garis bawah ganda. Jadi, mungkin lebih akurat untuk mengatakan bahwa jika kode Anda dikompilasi-pedantic -ansi
, dan juga terlihat masuk akal seperti mungkin dikompilasi pada implementasi lain, maka itu akan dikompilasi.Jika Anda menulis kode yang menurut Anda akan dikompilasi pada berbagai macam platform, dengan sejumlah kompiler yang berbeda, maka menggunakan tanda ini sendiri akan membantu memastikan Anda tidak menghasilkan kode yang hanya dikompilasi di bawah GCC.
sumber
Yang lainnya menjawab cukup. Saya hanya ingin menambahkan beberapa contoh ekstensi yang sering:
The
main
Fungsi kembalivoid
. Ini tidak ditentukan oleh standar, artinya ini hanya akan bekerja pada beberapa kompiler (termasuk GCC), tetapi tidak pada yang lain. Omong-omong,int main()
danint main(int, char**)
adalah dua tanda tangan yang didefinisikan oleh standar.Ekstensi populer lainnya adalah mampu mendeklarasikan dan mendefinisikan fungsi di dalam fungsi lain:
void f() { void g() { // ... } // ... g(); // ... }
Ini tidak standar. Jika Anda menginginkan perilaku seperti ini, lihat C ++ 11 lambda
sumber
Pedantic membuatnya sehingga compiler gcc menolak semua ekstensi GNU C tidak hanya yang membuatnya kompatibel dengan ANSI.
sumber