从内联函数调用中调用内联函数

Calling an inline function from an inline function call?

本文关键字:函数 调用 函数调用      更新时间:2023-10-16

我注意到std::min和std::max都内联在stl_algobase.h头中,我想知道这样的一行是否会对(任何,尤其是gcc)编译器造成问题

a = std::max(b, std::min(c, d));

当这个表达式被内联时,这里实际发生了什么?


解释:

我遇到过一个根本没有意义的错误。我把错误追溯到以下几行:

float mouseScenePosX = mouseEvent->scenePos().x();
mouseScenePosX = max((float)0,
    min(mouseScenePosX, (float)scene->getSceneRect().width()-1));

在mouseScenePosX中,我总是得到0,尽管mouseScene PosX和scene->getSceneect().width()-1都大于0。奇怪的是,当我从makefile中删除-O2标志时,这个错误就消失了,而且,当我使用自己的min和max实现时。所以,我想知道它是否是由内联中的错误引起的。

它的行为保证就像调用函数一样。编译器所做的任何内联(如果有的话)都必须产生与不进行内联时相同的结果。

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

如果你发现一个编译器违反了这一点,就把它扔掉。

我从来没有见过关于这种事情的GCC错误。实际上,从来没有见过关于内联的错误。

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

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

如果它能更好地工作,那么min/max不是std::min和std::max。

因为std::min和std::max是函数(内联或非内联),调用约定不能中断,所以如果拆分会更好地工作是没有意义的。