用g ++编译C++ 11

Ron*_*nis 349 c++ flags 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};
    ...
}
Run Code Online (Sandbox Code Playgroud)

此文件需要编译器和库支持即将推出的ISO C++标准C++ 0x.此支持目前是实验性的,必须使用-std = c ++ 0x或-std = gnu ++ 0x编译器选项启用.

Osk*_* N. 507

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

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

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

要么

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

如果以上不起作用.

  • 有没有人知道C++编译器是否/何时默认支持C++ 11标准,即没有标志? (56认同)
  • 不要忘记在`g ++`之后放置`-Wall -g` (8认同)
  • @BasileStarynkevitch:我也会添加`-Werror`,没有理由不在启动项目时. (7认同)
  • 更好的C++ 11支持是有争议的,更好的诊断现在看起来不那么好(Clang的页面描述它们使用古老的GCC 4.2)http://gcc.gnu.org/wiki/ClangDiagnosticsComparison;) (3认同)
  • 如果您还不知道,在Visual C++中只需使用VC11(Visual Studio 2012)或更高版本即可获得C++ 11功能 (2认同)
  • @Dennis在此期间,您可以在bash_profile中使用别名:`alias gpp ="g ++ -std = c ++ 11"` (2认同)

小智 43

您可以g++通过命令检查:

which g++
g++ --version
Run Code Online (Sandbox Code Playgroud)

这将告诉你当前它指向哪个编译器.

要切换到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
Run Code Online (Sandbox Code Playgroud)

然后选择2作为选择(我的机器已经指向g++4.7,所以*)

一旦你切换编译器然后再次运行g++ --version检查切换是否正确发生.

现在编译您的程序

g++ -std=c++11 your_file.cpp -o main
Run Code Online (Sandbox Code Playgroud)


Mic*_*ade 13

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

  • @ Shravan40 OP在问题中明确表示"我正在使用Ubuntu 12.04.". (20认同)

小智 10

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

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


yad*_*dhu 6

您可以参考以下链接,这些链接在特定版本的编译器中受支持。它提供了编译器中功能支持的详尽列表。看起来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++2a对于C ++ 20,尽管尚不支持C ++ 20的所有功能,但请参考此链接以获取GCC中的功能支持列表。

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


Sad*_*ara 6

使用-std=c++11ISO C++11 的编译器标志。
有关 C++ 编译器标志和选项的更多详细信息,请检查此