不同版本gcc、g++的默认支持的std C++标准

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值