我今天在为了测试不同标准下的 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 | alias g++97='g++-11 -std=c++98'; |
然后你就可以使用 g++14
/g++17
/g++20
等命令来编译你的代码了。
那就这样,GL&HF!