cmake+gcc解决extended initializer lists only available with -std=c++11 or -std=gnu++11

83 篇文章 20 订阅
42 篇文章 28 订阅

有时,我们需要一个结构体变量做为参数传递给函数,后面又不需要再用到这个结构体变量,所以如果专门定义一个变量,再将这个变量传递给函数就显得挺罗嗦。
就像下面这段代码,tmpStruct只是起到一个数据包装的作用,调用test()之后并不再用到,所以这个变量就显示有些多余 。

#include <iostream>
struct _stA{
	char *a;
	int b;
	int c;
}stA;
void test(_stA n){
	cout<<n.a<<endl;
}
int main() {
	char str[]="hello!";
	_stA tmpStruct{str,0,1};//定义一个变量装载str等数据;
	//或者写成_stA tmpStruct={str,0,1}也是可以的
	test(tmpStruct);//将tmpStruct做为变量传递给test
}

这时我们可以将数据包装成临时结构体变量(或者叫匿名变量)传递给要调用函数。所以调用方式可以简化成下面这样:

int main() {
	char str[]="hello!";
	test(_stA{str,0,1});//编译器会为_stA{str,0,1}结构体生成一个临时变量
}

但是重新编译,会出下面警告

J:\workspace\codemgr\cmimpl\testmd5.cpp: In function ‘int main()’:
J:\workspace\codemgr\cmimpl\testmd5.cpp:26:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
test(_stA{str,0,1});

它的意思大概就是_stA{str,0,1}这种用列表初始化结构的方式要在c++ 11标准中才支持。
initializer lists是c++11的特性 (参见 std::initializer_list(点击打开链接))

so,对于cmake生成的项目,我们就需要在CMakeLists.txt中添加如下编译选项

add_definitions(“-std=c++11”)

或者

add_definitions("-std=gnu++11)

然后重新生成makefile,编译警告就消失了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值