Qt程序构建后警告:control reaches end of non-void function [-Wreturn-type]
它的意思是:控制到达非void函数的末尾。意识就是一些本应带有返回值的函数到达结尾后可能并没有返回任何值。
警告出现的代码段如下:
connect(UpdateTemp,&QTimer::timeout,[=]()
{
//qDebug()<<"嘿!";
//存入数据库
QSqlQuery query;
QString sql = QString("insert into data(time,ion,temperature,humidity) values('%1',%2,%3,%4)")
.arg(current_date)
.arg(ion)
.arg(temperature)
.arg(humidity);
if(!query.exec(sql))
{
QSqlError lastError = query.lastError();
//qDebug()<<lastError.driverText()<<QString(QObject::tr("Insert failed!"));
ui->textEditRead->append("Insert failed!");
return false;
}
}
);//这里警告提示
一开始我是有点奇怪的,我这里明明是一个无参lambda呀!检查之后发现,我在一个if判断里面返回了一个false,但如果if判断不成立,程序结尾是没有返回值的,与if里面的返回值不统一,要么都有同种类型的返回值,要么都没有。
if(!query.exec(sql))
{
QSqlError lastError = query.lastError();
//qDebug()<<lastError.driverText()<<QString(QObject::tr("Insert failed!"));
ui->textEditRead->append("Insert failed!");
return false;
}
找到问题根源之后,就很好解决了:
1、屏蔽if的返回值//return false;
使lambda函数体内没有返回值(我用的这种方法,因为我这个表达式不需要返回值);
2、保留if的返回值,同时在lambda函数尾部也返回一个bool值,与if中的返回值类型保持一致:
connect(UpdateTemp,&QTimer::timeout,[=]()
{
//qDebug()<<"嘿!";
//存入数据库
QSqlQuery query;
QString sql = QString("insert into data(time,ion,temperature,humidity) values('%1',%2,%3,%4)")
.arg(current_date)
.arg(ion)
.arg(temperature)
.arg(humidity);
if(!query.exec(sql))
{
QSqlError lastError = query.lastError();
//qDebug()<<lastError.driverText()<<QString(QObject::tr("Insert failed!"));
ui->textEditRead->append("Insert failed!");
return false;
}
return true;}//根据实际情况,选择false或true
);
总之:lambda表达式的返回值类型需要与其参数类型一致,如:[](){}
不需要返回值,[](int a,int b){}
返回值为int;lambda函数体内可以没有返回值,但如果有返回值,无论什么情况,函数体内都必须有一个返回值,且函数体内的返回值类型必须保持一致;
另外,lambda表达式是可以显示指定返回值类型的:
lambda太复杂时,无法进行返回值推演。如果需要返回值,请显式指定返回值类型,如:[]()->bool{}