2011年(17)
分类: C/C++
2011-09-26 16:32:53
下面是一段很普通的意图进行QT标准对话框操作的代码:
if(QMessageBox::Yes==QMessageBox::warning(this,tr(""),tr("")+QString::fromStdString(layer->getName())),QMessageBox::Yes)
{
......
}
这段代码是可以编译通过,并能够运行的(不仔细看的话会认为是正常运行),但是其中却包含了一个非常隐蔽的错误。
在getName()一行多写了一个右括号,发现这个错误的时候我非常意外,想不通为什么这里编译器没能够识别这样一个简单的括号不匹配的错误。
后来同事一句话提醒了我,逗号表达式!
这里有一个巧合,QMessageBox::Yes正好是一个默认参数,编译器将多余的括号跟QMessageBox::warning(匹配了,这样整个代码的括号被解析匹配成了下面的样子
if(QMessageBox::Yes==QMessageBox::warning(this,
tr(""),
tr("")+QString::fromStdString(layer->getName())
),
QMessageBox::Yes
)
这样在if语句里就形成了一个逗号表达式,在语法上是通过的。
而且因为逗号表达式是从左执行的,最终对if起作用的是QMessageBox::Yes一句,导致里总是为真,从而出错。