ChatGPT解决这个技术问题 Extra ChatGPT

用 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 编译器选项启用。

在最新版本中,您可能必须改用 -std=c++11。不过,也许两者都是允许的。
这错过了很多上下文。显示您尝试过的完整命令(甚至可能是您尝试编译的示例代码),以及实际失败的内容。
@classdaknok_t:两者都应该被允许,ubuntu 12.04 也默认提供 g++-4.6(仅支持 -std=c++0x
g++ 之后添加标志,例如 g++ -std=c++0x _filename_ && ./a.out
偶然发现这篇文章,搜索标题为错误消息。我正在做一个 QMAKE 项目,我的解决方案是将 CONFIG += c++11 添加到 .pro 文件中。

O
Oskar N.

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

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

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

或者

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

如果上述方法不起作用。


不要忘记将 -Wall -g 放在 g++ 之后
@BasileStarynkevitch:我也会添加 -Werror,在开始项目时没有理由不添加。
更好的 C++11 支持是值得商榷的,而现在更好的诊断看起来并没有那么好(描述它们的 Clang 页面使用的是古老的 GCC 4.2)gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
有谁知道 C++ 编译器是否/何时默认支持 C++11 标准,即没有标志?
如果您还不知道,在 Visual C++ 中只需使用 VC11 (Visual Studio 2012) 或更高版本即可拥有 C++11 功能
C
Christoph

您可以通过以下命令检查您的 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++ 并替换系统的编译器以供参考
y
yadhu

您可以参考下面的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 中的功能支持列表,请参阅此链接。

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


G
Guy Avraham

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


你怎么能这么说,他正在使用 ubuntu ?只是好奇想知道。
@Shravan40 OP 在问题中明确表示 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++。
D
Dada

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


这个答案是多余的并且被接受的答案。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅