用g++编译c++ 11

我正在尝试更新我的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编译器选项来启用。

875684 次浏览

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

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

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

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

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

如果以上都不奏效。

如果你想保留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++ style // 注释,而-std=gnu99 - pepetic不会

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

你可以参考下面的链接来了解哪个版本的编译器支持哪些功能。它拥有现代编译器中功能支持的详尽列表。GCC似乎非常严格地遵循标准,并且先于任何其他编译器实现。

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

  1. g++ source_file.cpp -o executable_name -std=c++11 for c++ 11
  2. g++ source_file.cpp -o executable_name -std=c++14 for c++ 14
  3. g++ source_file.cpp -o executable_name -std=c++17 for c++ 17
  4. g++ source_file.cpp -o executable_name -std=c++2a for c++ 20,目前还不支持c++ 20的所有特性。GCC中的特性支持列表请参考链接

这个列表变化得很快,如果你在等待某个特定的特性得到支持,请密切关注这个列表。

在ISO c++ 11中使用-std=c++11编译器标志。
有关c++编译器标志和选项的更多详细信息,检查这个.