我正在尝试将我的 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 编译器选项启用。
-std=c++11
。不过,也许两者都是允许的。
g++-4.6
(仅支持 -std=c++0x
)
g++
之后添加标志,例如 g++ -std=c++0x _filename_ && ./a.out
。
标志(或编译器选项)只不过是传递给编译器可执行文件的普通命令行参数。
假设您正在从命令行(终端)调用 g++:
$ g++ -std=c++11 your_file.cpp -o your_program
或者
$ g++ -std=c++0x your_file.cpp -o your_program
如果上述方法不起作用。
您可以通过以下命令检查您的 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
您可以参考下面的link了解哪个版本的编译器支持哪些功能。它在现代编译器中提供了详尽的功能支持列表。似乎 GCC 非常严格地遵循标准并在任何其他编译器之前实现。
关于你的问题,你可以编译使用
g++ source_file.cpp -o executable_name -std=c++11 for C++11 g++ source_file.cpp -o executable_name -std=c++14 for C++14 g++ source_file.cpp -o executable_name -std=c+ +17 for C++17 g++ source_file.cpp -o executable_name -std=c++2a for C++20, C++20 的所有特性还不支持。有关 GCC 中的功能支持列表,请参阅此链接。
列表变化很快,如果您正在等待支持特定功能,请密切关注列表。
您的 Ubuntu 肯定有足够新的 g++
版本。要使用的标志是 -std=c++0x
。
I'm using Ubuntu 12.04.
。
如果要保留 GNU 编译器扩展,请使用 -std=gnu++0x 而不是 -std=c++0x。这是手册页中的引用:
编译器可以接受几个基本标准,例如 c89 或 c++98,以及这些标准的 GNU 方言,例如 gnu89 或 gnu++98。通过指定一个基本标准,编译器将接受所有遵循该标准的程序以及那些使用不与该标准相抵触的 GNU 扩展的程序。例如,-std=c89 会关闭 GCC 的某些与 ISO C90 不兼容的特性,例如“asm”和“typeof”关键字,但不会关闭其他在 ISO C90 中没有意义的 GNU 扩展,例如省略"?:" 表达式的中间词。另一方面,通过指定标准的 GNU 方言,编译器支持的所有特性都被启用,即使这些特性改变了基本标准的含义并且某些严格符合的程序可能会被拒绝。 -pedantic 使用特定标准来确定哪些功能是给定该标准版本的 GNU 扩展。例如 -std=gnu89 -pedantic 会警告 C++ 样式 // 注释,而 -std=gnu99 -pedantic 不会。
?:
运算符之外,这还能为您带来什么?唯一想到的其他扩展,结构表达式,被 C++11 列表初始化所取代。无论如何,这句话主要与 C 相关,而不是 C++。
-Wall -g
放在g++
之后-Werror
,在开始项目时没有理由不添加。