首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从内联函数调用调用内联函数?

从内联函数调用调用内联函数?
EN

Stack Overflow用户
提问于 2012-09-10 08:32:57
回答 2查看 173关注 0票数 1

我注意到std::min和std::max都内联在stl_algobase.h头中,我想知道这样的行是否会对编译器(特别是gcc)有问题:

代码语言:javascript
复制
a = std::max(b, std::min(c, d));

如果这个表达式是内联的,这里到底会发生什么?

解释:

我有过this错误,这一点都说不通。我将错误追溯到以下几行:

代码语言:javascript
复制
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实现时也消失了。所以,我想知道它是否会由内联中的一个错误引起。

EN

回答 2

Stack Overflow用户

发布于 2012-09-10 08:35:49

保证它的行为就像它发出函数调用一样。编译器所做的任何内联(如果有的话)绝对必须产生与没有执行内联相同的结果。

换句话说,您的示例代码应该按照您的预期工作,返回比较b的最大值和比较c到d的最小值。

如果您找到一个违反此规则的编译器,请将其丢弃。

我从来没有见过GCC对这类事情的错误。实际上从来没有见过一个关于内联的bug。

票数 3
EN

Stack Overflow用户

发布于 2012-09-12 00:10:10

您可能想尝试在最后一个参数中添加括号:

getSceneRect().width()-1);?>

如果这样做效果更好,那么min/max就不是std::min和std::max。

如果拆分会更好,这是没有意义的,因为std::min和std::max是函数(内嵌与否),而调用约定就是不能中断的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12347916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档