2012-04-28 37 views
258

C++コンパイラをC++ 11に更新しようとしています。 少し調べましたが、フラグ-std=c++0xまたは-std=gnu++0xを使用しなければならないという結論に達しましたが、フラグに関することはよく分かりません。誰でも助けてくれますか? (私はUbuntuの12.04を使用しています)。ここg ++でC++ 11をコンパイルする

は、私はC++ 11(すなわち配列)に含まれているライブラリを使用しようとしたとき、私は、コンパイラから取得エラーです:

#include <array> 
#include <iostream> 

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

This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

+0

を使ってプログラムをコンパイルします。メイクファイル? Eclipse?他に何か? – dutt

+3

最新のバージョンでは、代わりに、おそらく '-std = C++ 11'を使用する必要があります。しかし、どちらも可能です。 –

+6

これは多くのコンテキストを失います。試した完全なコマンド(コンパイルしようとしたサンプルコードでさえ)と、実際には失敗したものを表示します。 – KillianDS

答えて

386

フラグ(またはコンパイラオプション)は、コンパイラの実行可能ファイルに渡される通常のコマンドライン引数です。上記が動作しない場合

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

または

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

:あなたは、コマンドライン(ターミナル)からグラムを++呼び出していると仮定すると、

+6

'g ++'の直後に '-Wall -g'を付けることを忘れないでください。 –

+5

@BasileStarynkevitch:' -Werror'も追加します。 –

+0

それは働いた!どうもありがとうございました! –

11

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

+0

どうやって、彼はubuntuを使っていますか?ちょうど興味があることを知っている。 – Shravan40

+9

@ Shravan40 OPは質問に「私はUbuntu 12.04を使用しています」と明示しています。 –

8

GNUコンパイラの拡張機能を使用する場合は、-std = C++ 0xではなく-std = gnu ++ 0xを使用します。コンパイラは、このような、そのようなgnu89またはGNU ++ 98のように、これらの規格のC89やC++ 98、 およびGNU方言、などいくつかの基本基準を、受け入れることができ

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

+0

そして、バイナリの '?:'演算子を除けば、何が得られますか?唯一の他の拡張である構造式は、C++ 11のリストの初期化によって置き換えられます。いずれの場合でも、この引用符は主にCに関係し、C++には関係しません。 – Potatoswatter

39

は、コマンドによって、あなたのg++を確認することができます。

which g++ 
g++ --version 

これは、現在、それが指しているされているコンパイラを教えてくれます。

g++に切り替えるには4。あなたはその後、コンパイラを切り替えるとその後の選択として2を選択

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 

(私のマシンはすでにg++ 4.7を指しているので、*)

:7実行、(あなたはあなたのマシンでそれをインストールしていると仮定して)もう一度g++ --versionを実行して、切り替えが正しく行われたことを確認します。

は今、それはあなたが構築するために使用しているかに依存

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

g ++ 4.4のようなバージョンは、機能を実行するには古すぎるかもしれないので、アップグレードが必要です。アップグレードはお使いのシステムによって異なりますので、自分でg ++をコンパイルして参照するためにシステムのコンパイラを置き換える方法は避けてください –

関連する問題