web-dev-qa-db-ja.com

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

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コンパイラー・オプションを使用して使用可能にする必要があります。

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

コマンドライン(端末)からg ++を起動していると仮定します。

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

または

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

上記がうまくいかない場合.

469
Oskar N.

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
41
Harajyoti Das

あなたのubuntuは間違いなくg ++の最新版を持っています。使用するフラグは-std=c++0xです。

12
Michael Slade

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

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

10
user1356386

特定のバージョンのコンパイラでサポートされている機能については、次の link を参照してください。それはコンパイラの機能サポートの網羅的なリストを持っています。 GCCは標準に厳密に従っており、他のコンパイラよりも先に実装されています。

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

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

特定の機能がサポートされるのを待っているのであれば、リストはかなり速く変化します。リストを見てください。

4
yadhu