-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 program
struct test {
int zero_size_array[0];
};
The C11 rancangan n1570 ayat 6.7.6.2p1 mengatakan :
Selain kualifikasi tipe opsional dan kata kunci statis, [dan] dapat membatasi ekspresi atau *. Jika mereka membatasi ekspresi (yang menentukan ukuran array), ekspresi tersebut harus memiliki tipe integer. Jika ekspresi adalah ekspresi konstan, itu harus memiliki nilai lebih besar dari nol. [...]
Standar C mengharuskan panjang array lebih besar dari nol; dan paragraf ini ada dalam batasan ; standar mengatakan 5.1.1.3p1 berikut :
Implementasi yang sesuai harus menghasilkan setidaknya satu pesan diagnostik (diidentifikasi dengan cara yang ditentukan implementasi) jika unit terjemahan praproses atau unit terjemahan berisi pelanggaran aturan atau batasan sintaks, bahkan jika perilaku tersebut juga secara eksplisit ditetapkan sebagai tidak ditentukan atau implementasi- ditentukan. Pesan diagnostik tidak perlu dibuat dalam keadaan lain.9)
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.