我注意到std::min和std::max都内联在stl_algobase.h头中,我想知道这样的行是否会对编译器(特别是gcc)有问题:
a = std::max(b, std::min(c, d));如果这个表达式是内联的,这里到底会发生什么?
解释:
我有过this错误,这一点都说不通。我将错误追溯到以下几行:
float mouseScenePosX = mouseEvent->scenePos().x();
mouseScenePosX = max((float)0,
min(mouseScenePosX, (float)scene->getSceneRect().width()-1));我总是在mouseScenePosX中得到0,尽管mouseScenePosX和场景->getSceneRect().width()-1都大于0。奇怪的是,当我从makefile中删除-O2标志时,bug就消失了,而且当我使用自己的min和max实现时也消失了。所以,我想知道它是否会由内联中的一个错误引起。
发布于 2012-09-10 08:35:49
保证它的行为就像它发出函数调用一样。编译器所做的任何内联(如果有的话)绝对必须产生与没有执行内联相同的结果。
换句话说,您的示例代码应该按照您的预期工作,返回比较b的最大值和比较c到d的最小值。
如果您找到一个违反此规则的编译器,请将其丢弃。
我从来没有见过GCC对这类事情的错误。实际上从来没有见过一个关于内联的bug。
发布于 2012-09-12 00:10:10
您可能想尝试在最后一个参数中添加括号:
getSceneRect().width()-1);?>
如果这样做效果更好,那么min/max就不是std::min和std::max。
如果拆分会更好,这是没有意义的,因为std::min和std::max是函数(内嵌与否),而调用约定就是不能中断的。
https://stackoverflow.com/questions/12347916
复制相似问题