-std = c ++ 11と-std = gnu ++ 11の違いは何ですか?


132

gccとclangのコンパイルパラメータ-std=c++11との違いは何-std=gnu++11ですか?同じ質問c99gnu99?私はC ++とC標準について知っています。興味があるのはパラメーターの違いです。

私はそれがいくつかの拡張機能に関係していることをどこかで読んだことがありますが、どれがどれで、どのように新しいプロジェクトでどちらを選択するかははっきりしません。


5
これらgnuは拡張機能を参照しているため、移植可能なコードを作成する場合は、標準に固執し、拡張機能を完全に避ける必要があります。
juanchopanza

回答:


91

ご存知のとおり、2つのオプションの違いは、C ++標準に違反/拡張するGNU拡張機能が有効になっているかどうかです。ここでは、GNU C ++拡張機能について説明します。C ++プログラムでは、ほとんどのGNU C拡張機能(ここで説明)を使用することもできます。ここで-Wpedantic GCCオプションについて読むことも役に立ちます

一部の拡張機能は-std=c++11、標準と矛盾しない限り、を使用しても引き続き有効であることに注意してください。たとえば、MinGWコンパイラを使用する場合、機能するための拡張機能が必要Boost.Lexical_Castです。ただし、それらを使用しない限り、移植性を最大化するために、拡張機能を使用せずに標準に準拠することをお勧めします。これは、コンパイラを変更せざるを得ない場合に便利です。


4
ええ、私は標準で明確に定義されていないことは何もしないことをお勧めしないので、拡張機能を避けます...しかし、それでも、「違反」は、これらの拡張機能の多くがStandardeseを使用する場合、奇妙でロードされた用語です、標準が沈黙していること、あるいはおそらく拡張のすべてを実装定義または指定するだけ...標準が明示的に定義することとは異なる何かを行うことによって標準に違反するGNU拡張の引用はありますか?
underscore_d 2016

9
この答えは良い一般的な答えですが、少なくとも有効になっているが有効になってgnu11いない拡張機能を一覧表示するように編集することを検討しc++11ますか?リンクしたリストはすべての拡張機能のものであり、あなた自身が示すように、それらの一部c++11も同様に有効になっています(など__restrict__)。
einpoklum 2016年

私が今見つけたもので、フラグのドキュメントを見ても結論が出ないことは次のとおりです。-std = c ++ 11は3文字表記を再度有効にします-std = gnu ++ 11はそれらを無視して警告を出します。 -stdを
すべて
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.