用g ++编译C ++ 11


367

我正在尝试将我的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
在最新版本中,您可能不得不使用-std=c++11。不过,也许两者都被允许。

6
这错过了很多背景。显示您尝试过的完整命令(甚至是您尝试编译的示例代码)以及实际失败的地方。
KillianDS

4
@classdaknok_t:都应允许,g++-4.6默认情况下也应启用ubuntu 12.04 (仅支持-std=c++0x
KillianDS

3
在其后添加标志g++,例如g++ -std=c++0x _filename_ && ./a.out
n。代词

1
来到这篇文章,搜索标题错误消息。我正在研究QMAKE项目,对我来说,解决方案是将CONFIG + = c ++ 11添加到.pro文件。

Answers:


529

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

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

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

要么

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

如果上述方法不起作用。


8
不要忘记放-Wall -gg++
Basile Starynkevitch 2012年

7
@BasileStarynkevitch:我也想补充-Werror一点,没有理由在启动项目时不要这样做。
Matthieu M.

3
更好的C ++ 11支持值得商and,如今更好的诊断似乎没有那么好(Clang的页面描述了它们使用的是GCC 4.2,这是古老的)gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely 2012年

58
是否有人知道C ++编译器是否/何时默认支持C ++ 11标准,即没有标志?
丹尼斯

2
如果您还不知道,在Visual C ++中,只需使用VC11(Visual Studio 2012)或更高版本即可具有C ++ 11功能
gerrytan 2014年

44

您可以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

可能值得一提的是,像g ++ 4.4这样的版本可能太旧了,无法执行某些功能,因此必须进行升级。升级将取决于您的系统上,我会避免编译G ++自己和更换系统的编译器的参考方法
科林·d


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不会。


除了二元?:运算符之外,还有什么呢?想到的唯一其他扩展是结构表达式,将由C ++ 11列表初始化取代。无论如何,此引用主要涉及C,而不涉及C ++。
Potatoswatter 2012年

9

您可以参考以下链接,这些链接在特定版本的编译器中受支持。它提供了编译器中功能支持的详尽列表。看起来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中的功能支持列表。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.