GNU的gcc、g++编译器的版本和它们支持的C++标准并不是一回事。
例如,gcc/g++有4、5、6、7、8、9、10、11版本,它们支持的C++标准可能是c++98、c++11、c++14、c++17,而且有时一个gcc版本可以通过-std=c++14选项,支持多个C++标准.
例如,g++-9可以支持c++98到c++14,g++-11可以支持c++98到c++14。
而g++-9默认支持的标准是c++14,g++-11默认支持的标准是c++17,默认支持C++标准的不同,可能导致低版本编译器可以编译的代码,在高版本(编译器)不能编译。
尽管在g++-11编译时,可以添加编译选项 -std=c++14,让g++-11编译器按照C++14的标准来向下兼容,但最好有办法可以知道不同版本gcc编译器支持的默认C++标准。
网上有篇文章通过程序检测gcc编译器支持的默认C++标准,亲自试过非常好用:
【经验】如何查看gcc、g++不加-std时的默认版本_gun gcc std选项-CSDN博客
我主要是用C++的代码:gcc编译器有个__cplusplus宏,这个宏是个字符串,这个字符串值与它正在使用的的C++标准是有联系的,但是仅仅从字符串比较难看出gcc编译所使用的C++标准,而且当编译时指定-std=选项时,这个宏就会改变,表示当前编译所使用的C++标准,一个版本gcc一般会支持多种C++标准,但是有个默认标准,就是不使用-std选项时__cplusplus宏的值。
#include <iostream>
int main(void) {
#ifdef __cplusplus
std::cout << "__cplusplus = " << __cplusplus << std::endl;
#endif
#ifdef __STRICT_ANSI__
std::cout << "__STRICT_ANSI__ = " << __STRICT_ANSI__ << std::endl;
#endif
return 0;
}
用下面的shell脚本编译上面的代码,分别使用不同标准,每次编译,打印使用的C++标准和对应的__cplusplus宏的值,最后不使用-std选项编译一次,所打印的__cplusplus宏,根据前面的对应关系,就可知道默认使用的C++标准。
for std in c++98 c++11 c++14 c++17 gnu++98 gnu++11 gnu++14 gnu++17; do
echo $std
g++-9 -std=$std -o cpp.out cpp.cpp
./cpp.out
echo
done
echo default
g++-9 -o cpp.out cpp.cpp
./cpp.out