Apa perbedaan antara -std = c ++ 11 dan -std = gnu ++ 11?

132

Apa perbedaan antara -std=c++11dan -std=gnu++11sebagai parameter kompilasi untuk gcc dan dentang? Pertanyaan yang sama dengan c99dan gnu99? Saya tahu tentang C ++ dan standar C, itu adalah perbedaan dalam parameter yang menarik minat saya.

Saya telah membaca di suatu tempat bahwa itu ada hubungannya dengan beberapa ekstensi tetapi tidak jelas bagi saya yang mana dan bagaimana memilih antara satu atau yang lain untuk proyek baru.

Klaim
sumber
5
Yang gnumerujuk ke ekstensi, dan jika Anda ingin menulis kode portabel Anda harus tetap berpegang pada standar dan menghindari ekstensi sama sekali.
juanchopanza

Jawaban:

91

Seperti yang Anda ketahui sendiri, perbedaan antara dua opsi adalah apakah ekstensi GNU yang melanggar / memperpanjang standar C ++ diaktifkan atau tidak. Ekstensi GNU C ++ dijelaskan di sini . Anda juga dapat menggunakan sebagian besar ekstensi GNU C (dijelaskan di sini ) dalam program C ++ Anda. Akan bermanfaat juga untuk membaca tentang -Wpedanticopsi GCC di sini .

Perhatikan bahwa beberapa ekstensi masih dapat berlaku saat menggunakan -std=c++11, selama mereka tidak bertentangan dengan standar. Sebagai contoh, ketika menggunakan kompiler MinGW, saya perlu ekstensi untuk berfungsi Boost.Lexical_Cast. Tapi, selama Anda tidak menggunakannya, Anda lebih baik tetap berpegang pada standar tanpa ekstensi untuk portabilitas maksimum. Ini mungkin berguna jika Anda terpaksa mengganti kompiler.

daramarak
sumber
4
Ya, saya menghindari ekstensi karena saya tidak merekomendasikan melakukan apa pun yang tidak secara spesifik didefinisikan oleh Standar ... tetapi meskipun demikian, "melanggar" adalah istilah yang aneh dan dimuat, ketika banyak ekstensi ini, untuk menggunakan Standardese , hanya mendefinisikan-menetapkan atau menentukan hal-hal yang menjadi standar diam - atau mungkin bahkan semua ekstensi ... Apakah Anda memiliki kutipan untuk setiap ekstensi GNU yang melanggar Standar dengan melakukan sesuatu yang berbeda dari sesuatu yang secara eksplisit didefinisikan oleh Standar?
underscore_d
9
Meskipun jawaban ini adalah jawaban umum yang bagus, apakah Anda akan mempertimbangkan untuk mengeditnya sehingga setidaknya mencantumkan ekstensi yang diaktifkan gnu11tetapi tidak di dalamnya c++11? Daftar yang Anda tautkan adalah semua ekstensi, dan seperti yang Anda tunjukkan, beberapa di antaranya juga diaktifkan c++11(seperti __restrict__).
einpoklum
Apa yang saya temukan sekarang, dan tidak akan pernah menyimpulkan dengan melihat dokumentasi bendera, adalah sebagai berikut: -std = c ++ 11 mengaktifkan kembali trigraphs -std = gnu ++ 11 mengabaikan mereka dan memancarkan peringatan, seperti itu lakukan ketika menghilangkan -std alltogether
Daniel82