1

我注意到 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,尽管 mouseScenePosX 和 scene->getSceneRect().width()-1 都大于 0。奇怪的是,当我从 makefile 中删除 -O2 标志时,错误消失了,而且当我使用我自己的最小和最大实现。所以,我想知道它是否可能是由内联错误引起的。

4

2 回答 2

3

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

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

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

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

于 2012-09-10T08:35:49.813 回答
0

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

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

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

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

于 2012-09-12T00:10:10.763 回答