用g ++编译C ++ 11

时间:2012-04-28 12:52:24

标签: c++ c++11 g++ flags

我正在尝试将我的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 个答案:

答案 0 :(得分:471)

Flags(或编译器选项)只是传递给编译器可执行文件的普通命令行参数。

假设您从命令行(终端)调用g ++:

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

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

如果上述方法不起作用。

答案 1 :(得分:41)

您可以通过命令检查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

答案 2 :(得分:12)

你的ubuntu肯定有一个足够新版的g ++。要使用的标志是-std=c++0x

答案 3 :(得分:10)

如果要保留GNU编译器扩展,请使用-std = gnu ++ 0x而不是-std = c ++ 0x。以下是手册页中的引用:

  

编译器可以接受几个基本标准,例如c89或c ++ 98,   和那些标准的GNU方言,例如gnu89或gnu ++ 98。通过   指定基本标准,编译器将接受所有程序   遵循该标准和那些不使用GNU扩展的标准   与之相矛盾。例如,-std = c89会关闭GCC的某些功能   与ISO C90不兼容的,例如“asm”和“typeof”   关键字,但没有其他没有意义的GNU扩展   ISO C90,例如省略“?:”表达式的中间项。在   另一方面,通过指定标准的GNU方言,所有功能   即使这些功能发生了变化,也会启用编译器支持   基本标准的含义和一些严格符合的程序可能   被拒绝特定标准由-pedantic用于识别   鉴于该标准的版本,哪些功能是GNU扩展。   例如-std = gnu89 -pedantic会警告C ++风格//   注释,而-std = gnu99 -pedantic则不会。

答案 4 :(得分:4)

您可以参考以下link,其中特定版本的编译器支持这些功能。它提供了编译器中功能支持的详尽列表。看起来GCC严格遵循标准并在任何其他编译器之前实现。

关于您的问题,您可以使用

进行编译
  1. g++ -std=c++11 for C ++ 11
  2. g++ -std=c++14 for C ++ 14
  3. g++ -std=c++17 for C ++ 17
  4. g++ -std=c++2a用于C ++ 20,尽管尚不支持C ++ 20的所有功能,但请参考link以获得GCC中的功能支持列表。

如果您正在等待特定功能的支持,则列表变化非常快,请密切注意列表。