【问题标题】:Is g++ different than g++ -std=c++14 when the default standard is 201402L (c++14)?当默认标准为 201402L (c++14) 时 g++ 与 g++ -std=c++14 有什么不同吗?
【发布时间】:2021-07-14 00:51:36
【问题描述】:

我正在尝试使用预编译的头文件来加快以下链接的编译速度:https://codeforces.com/blog/entry/53909

我观察到头文件的预编译和 .cpp 程序的后续编译必须使用相同的 g++ 标志才能加速工作,这是有道理的。但是,将 c++ 标准显式设置为默认标准是行不通的。因此,使用g++ stdc++.h 和随后的g++ -std=c++14 program.cpp 进行预编译,g++ -std=c++14g++ program.cpp 都不起作用。

这对我来说没有意义,因为我知道我的编译器 x86_64-w64-mingw32-g++.exe(gcc 版本 10.2.0)默认符合 201402L (c++14) 标准,即我想使用g++ -dM -E -x c++ /dev/null | fgrep __cplusplus,并得到以下响应:

#define __cplusplus 201402L

所以,我的问题是,当 g++ 默认遵循 201402L 时,g++ 和 g++ -std=c++14 有什么区别?另外,我专门选择其中任何一个是否足够重要?

【问题讨论】:

  • 它可能会创建所有使用的选项的记录(如哈希总和)并将其放入预编译的标头中,如果重新编译时不匹配,它将重新创建预编译的标头。
  • 再想一想。 g++ 不默认为 -std=c++<something>。 Afaik,它默认为-std=gnu++<something>。检查是否在使用和不使用 -std=gnu++14 的情况下进行编译时是否做出相同的选择
  • 是的,g++ -std=gnu++14 和 g++ -std=gnu++1y(虽然已弃用)都有效,也就是说,预编译的头文件可以加速所有后续仅使用 g++ 的编译。跨度>

标签: gcc g++ c++14 precompiled-headers gcc10


【解决方案1】:

默认情况下,GCC 不使用 -std=c++14 编译。 GCC man pages(对于版本 9.3.0)中的 -std 标志的描述说

-std= 确定语言标准。目前仅在编译 C 或 C++ 时支持此选项。

编译器可以接受多个基本标准,例如 c90 或 c++98,以及这些标准的 GNU 方言,例如 gnu90 或 gnu++98。当一个基本标准被指定时,编译器接受所有遵循该标准的程序,以及那些使用 GNU 扩展但不与之相抵触的程序。
. . .
必须提供此选项的值;可能的值为
. . .
c++14
c++1y
2014 ISO C++ 标准加上修正案。名称 c++1y 已弃用。

gnu++14
gnu++1y
-std=c++14 的 GNU 方言。 这是 C++ 代码的默认设置。 名称 gnu++1y 已弃用。
. . .

强调我的。当前默认值为-std=gnu++14,它以C++14 标准为目标,同时也为C++ 语言启用GNU extensions-std=c++XX 标志和-std=gnu++XX 标志之间的区别在What are the differences between -std=c++11 and -std=gnu++11? 中有进一步说明。

【讨论】:

  • 谢谢。确认 g++ 和 g++ -std=gnu++14 是一回事。
猜你喜欢
  • 1970-01-01
  • 2016-10-27
  • 2015-10-14
  • 2017-11-11
  • 2017-05-29
  • 2015-11-05
  • 2016-06-22
  • 2018-05-12
  • 2013-09-14
相关资源
最近更新 更多