问题描述
我试图利用预编译头文件来加速以下链接的编译:https://codeforces.com/blog/entry/53909
我观察到必须使用相同的 g++ 标志来完成头文件的预编译和 .cpp 程序的后续编译,以加快工作速度,这是有道理的。但是,将 c++ 标准显式设置为默认标准是行不通的。因此,使用 g++ stdc++.h
和后续 g++ -std=c++14 program.cpp
进行预编译,g++ -std=c++14
和 g++ 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? 中有进一步说明。