-Std = c ++ 11 ve -std = gnu ++ 11 arasındaki farklar nelerdir?


132

Gcc ve clang için derleme parametresi olarak -std=c++11ve arasındaki farklar nelerdir -std=gnu++11? İle aynı soru c99ve gnu99? C ++ ve C standartlarını biliyorum, beni ilgilendiren parametrelerdeki farklılıklar.

Bir yerde bazı uzantılarla ilgisi olduğunu okudum ama yeni bir proje için hangilerini ve birini veya diğerini nasıl seçeceğimi bilmiyorum.


5
Bunlar gnuuzantılara atıfta bulunur ve taşınabilir kod yazmak istiyorsanız, bir standarda bağlı kalmalı ve uzantılardan tamamen kaçınmalısınız.
juanchopanza

Yanıtlar:


91

Sizin de öğrendiğiniz gibi, iki seçenek arasındaki fark, C ++ standardını ihlal eden / genişleten GNU uzantılarının etkin olup olmadığıdır. GNU C ++ uzantıları burada açıklanmıştır . Ayrıca C ++ programlarınızda GNU C uzantılarının çoğunu ( burada açıklanmıştır ) kullanabilirsiniz. Ayrıca okumak faydalı olacaktır -WpedanticGCC seçeneği burada .

-std=c++11Standartla çelişmedikleri sürece, bazı uzantıların kullanım sırasında hala geçerli olabileceğini unutmayın . Örneğin, MinGW derleyicisini kullanırken, bir çalışma için uzantılara ihtiyacım var Boost.Lexical_Cast. Ancak, hiçbirini kullanmadığınız sürece, maksimum taşınabilirlik için uzantılar olmadan standarda bağlı kalmak daha iyidir. Kendinizi derleyiciyi değiştirmek zorunda bulursanız bu kullanışlı olabilir.


4
Evet, uzantılardan kaçınıyorum çünkü Standart tarafından özel olarak tanımlanmayan herhangi bir şey yapmayı önermiyorum ... ancak bu uzantıların çoğu Standardese'yi kullanmak için "ihlal" tuhaf ve yüklü bir terimdir. , sadece Standardın sessiz kaldığı şeyleri - ya da hatta tüm uzantıları - uygulama-tanımlama veya belirleme ... Standardın açıkça tanımladığı bir şeyden farklı bir şey yaparak Standardı ihlal eden herhangi bir GNU eklentisine atıfınız var mı?
underscore_d

9
Bu cevap iyi bir genel cevap olsa da, en azından içinde etkin olan gnu11ancak içinde olmayan uzantıları listeleyecek şekilde düzenlemeyi düşünür müsünüz c++11? Bağlandığınız liste tüm uzantılara aittir ve sizin belirttiğiniz gibi bazılarının da etkinleştirilmiş olduğunu c++11(beğenmek __restrict__).
einpoklum

Şimdi öğrendiğim ve bayrakların belgelerine bakarak asla sonuca varamayacağım şey şudur: -std = c ++ 11 trigrafileri yeniden etkinleştirir -std = gnu ++ 11 onları yok sayar ve bunun gibi bir uyarı verir -std tamamen ihmal edildiğinde yapar
Daniel82
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.