当默认标准是 201402L (c++14) 时,g++ 与 g++ -std=c++14 不同吗?

问题描述

我试图利用预编译头文件来加速以下链接的编译:https://codeforces.com/blog/entry/53909

我观察到必须使用相同的 g++ 标志来完成头文件的预编译和 .cpp 程序的后续编译,以加快工作速度,这是有道理的。但是,将 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 之间有什么区别?另外,对于我来说,专门选择其中之一是否足够重要?

解决方法

GCC 默认不使用 -std=c++14 编译。来自 GCC man pages-std 标志的描述(对于 9.3.0 版)说

-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? 中有进一步说明。