繁体   English   中英

用 g++ 编译 C++11

[英]Compiling C++11 with g++

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

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

假设您从命令行(终端)调用 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

您可以参考以下链接了解哪个版本的编译器支持哪些功能。 它在现代编译器中提供了详尽的功能支持列表。 似乎 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 中的功能支持列表。

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

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

如果要保留 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 不会。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM