【问题标题】:What's the point of including -std=c++0x in a G++ compile command?在 G++ 编译命令中包含 -std=c++0x 有什么意义?
【发布时间】:2015-01-05 12:17:19
【问题描述】:

我最近开始学习 C++,由于我在 Linux 上,所以我正在使用 G++ 进行编译。

现在,我正在关注的教程说

如果您碰巧有 Linux 或 Mac 环境进行开发 功能,您应该能够直接编译任何示例 从终端只需在命令中包含 C++11 标志 编译器:

并告诉我使用以下命令进行编译:g++ -std=c++0x MY_CODE.cpp -o MY_APP

现在,我想知道的是,std=c++0x 标志的意义何在?是必需的,还是我可以运行g++ MY_CODE.cpp -o MY_APP

【问题讨论】:

  • 好久没用gcc了,上次查了一下,C++代码的默认模式是C++03,所以如果要使用C++11,就得指定这个标志明确。 (顺便说一句,你为什么不试试呢?)
  • 使用不支持的-std=c++11 GCC 版本越来越过时。
  • -std=c++11 开启了旧版标准 C++ 上不可用的某些语言功能
  • 这对于 gcc-5 来说应该是不必要的,它应该默认为 -std=gnu++11。切换尚未发生,所以谁知道...

标签: c++ linux c++11 g++


【解决方案1】:

默认情况下,GCC 为 gnu++98 编译 C++ 代码,这是 C++98 标准加上大量 gnu 扩展的一种奇特方式。

您使用-std=??? 告诉编译器它应该遵循什么标准。
不过不要省略-pedantic,否则它会在标准符合性上斜视。

您可以选择的选项:

standard          with gnu extensions

c++98             gnu++98
c++03             gnu++03
c++11 (c++0x)     gnu++11 (gnu++0x)
c++14 (c++1y)     gnu++14 (gnu++1y)

即将到来:

c++1z             gnu++1z (Planned for release sometime in 2017, might even make it.)

GCC 手册:https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Standards.html#Standards

另外,要求完整的警告,所以添加-Wall -Wextra

making the library include additional checks 有预处理器定义:

  • _GLIBCXX_CONCEPT_CHECKS 为某些模板先决条件添加额外的编译时检查。请注意,这些检查实际上并不总是做他们应该做的,因此已被弃用。
  • _GLIBCXX_DEBUG。启用库调试模式。这具有相当大的运行时开销。
  • _GLIBCXX_DEBUG_PEDANTIC 与上述相同,但检查标准要求,而不是仅检查实现。

【讨论】:

  • 所以,-pendantic 让它变得如此……g++ 不那么严格了?
  • @RPiAwesomeness: No -pedantic 使 GCC 实际上记住了您要求的标准一致性。否则就太宽容了。
  • 出色的演示文稿。但是既然你提到了-Wall -Wextra,你也应该提到-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -D_GLIBCXX_CONCEPT_CHECKS,它对图书馆做同样的事情。它们应该出现在每个调试版本中。 (对于发布版本,前两个会极大地影响性能,因此可能必须删除。)
  • 以及 C 的相关 -std= 选项:c90c99c11gnu90(C 的默认值)、gnu99gnu11。跨度>
  • 不推荐使用概念检查并破坏有效代码。您可以提及它,但必须带有一个大的警告标志...
【解决方案2】:

您想使用C++11 标准(您希望这样做是对的),但 C++11 在 w.r.t. 方面取得了巨大进步。其较旧的 C++98 标准。

但是旧版本的 GCC(即 GCC 4.8 或更早版本)在标准本身之前没有最终确定(因此他们接受了-std=c++0x 标志)。我强烈建议(如果你想要 C++11)使用最新版本的GCC,即GCC 4.9。 2014 年 10 月末出现了一个修复 GCC 4.9.2 版本的错误。所以请使用它,并将std=c++11 标志传递给它,告诉编译器你想要 C++11 一致性。

我实际上建议通过 std=c++11 -Wall -Wextra -g 来获取 C++11、所有警告和调试信息。一旦你调试了你的程序(用gdb,你最好也使用最新版本的gdb!)你可能会要求编译器用-O2优化(如果你想优化,也许-mtune=native用于您自己的计算机)

【讨论】:

  • 那么,我应该从 [这里](mirrors.concertpass.com/gcc/snapshots/LATEST-4.9/) 下载 GCC 4.9.2 吗?这似乎是一个 Nightly/Bleeding edge 版本......我可以在哪里下载稳定版 4.9.2?
  • 您可以从GNU GCC mirrors 下载源代码,然后您需要配置、构建和安装它。在源码树外的构建树中编译,并阅读installation instructions
【解决方案3】:

来源供您参考:

main.cpp

#include <iostream>
using namespace std;

int main()
{
    cout << "Test main CPP" << endl;
    return 0;
}

build.sh

rm demoASI*
echo "**cleaned !!**"

##### C++ 11 Compliance #####
# type ONE
g++ -o demoASI_1 -std=c++0x main.cpp
echo "**rebuild-main-done (C++ 11 Compilation) !**"

# type TWO
g++ -o demoASI_2 -std=c++11 main.cpp
echo "**rebuild-main-done (C++ 11 Compilation) !**"

##### C++ 11+ Compliance #####
# type THREE
g++ -o demoASI_3 -std=c++1y main.cpp
echo "**rebuild-main-done (C++ 11+ (i.e. 1y, but not C++14) Compilation) !**"

###### C++ 14 Compliance  ######
# type FOUR
g++ -o demoASI_4 -std=c++14 main.cpp
if [ $? -eq 0 ]
then
    echo "**rebuild-main-done (C++ 14 Compilation) !** :: SUCCESS"
else
    echo "**rebuild-main-done (C++ 14 Compilation) !** :: FAILED"
fi

现在,将脚本执行为; ./build.sh(假设build.sh有执行权限)

你可以先查看你的g++编译器的版本,如;

g++ --版本

g++ 4.3 以后的版本支持c++11

请参阅编译器中的c++14 支持信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多