C ++ 11をg ++でコンパイルする


367

C ++コンパイラをC ++ 11に更新しようとしています。少し検索して、フラグ-std=c++0xまたはを使用する必要があるという結論に達しましたが、フラグ-std=gnu++0xについて多くのことを知りません。誰か助けてもらえますか?(私はUbuntu 12.04を使用しています。)

これは、C ++ 11に含まれているライブラリ(つまり、配列)を使用しようとするとコンパイラーから発生するエラーです。

#include <array>
#include <iostream>

int main()
{
    std::array<int, 3> arr = {2, 3, 5};
    ...
}

このファイルには、今後のISO C ++標準であるC ++ 0xのコンパイラとライブラリのサポートが必要です。このサポートは現在実験段階であり、-std = c ++ 0xまたは-std = gnu ++ 0xコンパイラオプションで有効にする必要があります。


5
最新バージョンでは、おそらく-std=c++11代わりに使用する必要があります。たぶん、両方が許可されています。

6
これは多くの文脈を見逃しています。試した完全なコマンド(おそらく、コンパイルしようとしたサンプルコード)と実際に失敗したコマンドを表示します。
KillianDS 2012

4
@classdaknok_t:どちらも許可する必要があります。ubuntu12.04もg++-4.6デフォルトで出荷されます(これはのみをサポートします-std=c++0x
KillianDS

3
直後のフラグを追加しますg++例えば、g++ -std=c++0x _filename_ && ./a.out
n。「代名詞」m。

1
タイトル付きのエラーメッセージを検索して、この投稿に出くわしました。QMAKEプロジェクトに取り組んでいる私にとっての解決策は、CONFIG + = c ++ 11を.proファイルに追加することでした。

回答:


529

フラグ(またはコンパイラオプション)は、コンパイラの実行可能ファイルに渡される通常のコマンドライン引数にすぎません。

コマンドライン(ターミナル)からg ++を呼び出すと仮定します。

$ g++ -std=c++11 your_file.cpp -o your_program

または

$ g++ -std=c++0x your_file.cpp -o your_program

上記が機能しない場合。


8
-Wall -g直後に置くことを忘れないでくださいg++
Basile Starynkevitch 2012

7
@BasileStarynkevitch:私も追加し-Werrorます、プロジェクトを開始するときに理由はありません。
Matthieu M.12年

3
よりよいC ++ 11サポートは議論の余地があり、よりよい診断は最近それほどよく見えません(それらを説明するClangのページは古いGCC 4.2を使用しています)gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely

58
C ++コンパイラーがデフォルトで、つまりフラグなしでC ++ 11標準をサポートするかどうか、またはいつサポートするかを誰かが知っていますか?
デニス

2
そして、まだご存じない場合は、Visual C ++でVC11(Visual Studio 2012)以上を使用してC ++ 11の機能を追加するだけです
gerrytan

44

g++コマンドで確認できます:

which g++
g++ --version

これにより、現在どのコンパイラが指しているかがわかります。

g++4.7 に切り替えるには(マシンにインストール済みであることが前提)、次のコマンドを実行します。

sudo update-alternatives --config gcc

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path              Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-4.6   60        auto mode
  1            /usr/bin/gcc-4.6   60        manual mode
* 2            /usr/bin/gcc-4.7   40        manual mode

次に選択2として選択します(私のマシンはすでにg++4.7を指しているため、*)

コンパイラを切り替えたら、もう一度実行g++ --versionして、切り替えが正しく行われたことを確認します。

次に、プログラムをコンパイルします

g++ -std=c++11 your_file.cpp -o main

g ++ 4.4のようなバージョンは、一部の機能を実行するには古すぎる可能性があるため、アップグレードが必要であることを言及する価値があるかもしれません。アップグレードはシステムによって異なります。g++を自分でコンパイルしてシステムのコンパイラを参照用に置き換える方法は避けたいと思います
Colin D

13

あなたのubuntuには間違いなく十分に新しいバージョンのg ++​​があります。使用するフラグは-std=c++0xです。


彼はubuntuをどのように使用しているのでしょうか。知りたいだけです。
Shravan40 2014年

22
@ Shravan40 OP I'm using Ubuntu 12.04.が質問で明確に述べています。
Timothy Gu

10

GNUコンパイラの拡張機能を保持したい場合は、-std = c ++ 0xではなく-std = gnu ++ 0xを使用してください。これはmanページからの引用です:

コンパイラーは、c89やc ++ 98などのいくつかの基本標準、およびgnu89やgnu ++ 98などのそれらの標準のGNU方言を受け入れることができます。コンパイラーは、基本標準を指定することにより、その標準に準拠するすべてのプログラムと、GNU拡張機能を使用しており、それと矛盾しないプログラムを受け入れます。たとえば、-std = c89は、 "asm"や "typeof"キーワードなど、ISO C90と互換性のないGCCの特定の機能をオフにしますが、省略など、ISO C90で意味を持たない他のGNU拡張機能はオフにしません「?:」式の中期。一方、標準のGNU方言を指定すると、それらの機能が基本標準の意味を変更し、一部の厳密準拠プログラムが拒否される場合でも、コンパイラーサポートのすべての機能が有効になります。-pedanticは特定の標準を使用して、そのバージョンの標準で与えられたGNU拡張機能を識別します。たとえば、-std = gnu89 -pedanticはC ++スタイルの//コメントについて警告しますが、-std = gnu99 -pedanticは警告しません。


そして、二項?:演算子を除いて、それはあなたに何をもたらしますか?頭に浮かぶ唯一の他の拡張である構造式は、C ++ 11リストの初期化によって置き換えられます。いずれにせよ、この引用は主にC ++ではなくCに関連しています。
Potatoswatter

9

特定のバージョンのコンパイラでサポートされている機能については、次のリンクを参照してください。コンパイラでの機能サポートの完全なリストがあります。GCCは標準に厳密に従っており、他のコンパイラよりも前に実装されているように見えます。

あなたの質問に関しては、あなたが使用してコンパイルすることができます

  1. g++ -std=c++11 C ++ 11の場合
  2. g++ -std=c++14 C ++ 14の場合
  3. g++ -std=c++17 C ++ 17の場合
  4. g++ -std=c++2aC ++ 20の場合、C ++ 20のすべての機能はまだサポートされていませんが、GCCの機能サポートリストについては、このリンクを参照してください。

特定の機能がサポートされるのを待っている場合は、リストがかなり速く変更されます。リストに注目してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.