发布于 

更改或检查 C++ 编译器的标准并解释如何分辨 C++ 编译器的标准

我今天在为了测试不同标准下的 C++ 最大公约数与最小公倍数函数。(更多相关知识可以到 OI-wiki 上查看),因此我需要在 C++14 与 C++17 标准之间切换。我也因此找到了一些可以更便捷的方法来切换 C++ 标准并检查当前标准,现在分享给各位。

提示

本文中所有的 g++-11 均为我所使用的编译器的命令,你应当更换成你所使用的才可以让这些命令正常工作。

查询当前 C++ 编译器的标准

你可以使用以下命令来查询当前 C++ 编译器的标准:

1
g++-11 -dM -E -x c++  /dev/null | grep -F __cplusplus

使用这个命令会输出一个例如 #define __cplusplus 201703L 的东西,这个就是你的当前 C++ 编译器的标准。其中的 201703L 代表 2017 年 03 月 —— 也就是 C++ 标准委员会通过 C++17 标准的时间。你可以使用以下表格来查询对应的 C++ 编译器标准:1

  • 199711L - C++97(C++98)标准,其实这两个在编译器设置中都应被设置为 -std=c++98,因为其实 C++97 标准的一部分实际上是在 1998 年通过的。
  • 199811L - C++03 标准,由于标准的变更很少,所以标准委员会(很显然)决定不更改这个标准号。
  • 201103L - C++11 标准
  • 201402L - C++14 标准
  • 201703L - C++17 标准
  • 202002L - C++20 标准
  • 202100L - C++23 标准

另外,在标准被批准之前,一部分编译器会将 __cplusplus 定义为 0(或直接用 #define __cplusplus 定义为空)来表示 ”不符合标准“。1

另外,一些早起的 cfront(和其分支)会定义 c_plusplus 而非 __cplusplus,而且可能不包含实际意义的值。1

1: 参考:https://stackoverflow.com/a/11054055/10100764

切换 C++ 编译器标准

你可以在编译时通过 -std= 来指定 C++ 编译器标准,例如:

1
g++-11 -std=c++17 main.cpp -o main.out

C++ 标准对应的选项为:

  • -std=c++98 - C++98=7(C++98)标准
  • -std=c++03 - C++03 标准
  • -std=c++11 - C++11 标准
  • -std=c++14 - C++14 标准
  • -std=c++17 - C++17 标准
  • -std=c++20 - C++20 标准
  • -std=c++23 - C++23 标准

假如你觉得每次这么弄很麻烦,你也可以通过指定命令行 alias 来完成这项工作,下方是我使用的 alias

1
2
3
4
5
6
7
8
alias g++97='g++-11 -std=c++98';
alias g++98='g++-11 -std=c++98';
alias g++03='g++-11 -std=c++03';
alias g++11='g++-11 -std=c++11';
alias g++14='g++-11 -std=c++14';
alias g++17='g++-11 -std=c++17';
alias g++20='g++-11 -std=c++20';
alias g++23='g++-11 -std=c++23';

然后你就可以使用 g++14/g++17/g++20 等命令来编译你的代码了。

那就这样,GL&HF!