我在C++中使用像这样的宏读取它
#define max(a,b) (a > b ? a : b)
可能会导致“双重评估”。有没有人能给我举个例子,说明什么时候会发生双重评估,为什么会很糟糕?
附注:令人惊讶的是,当我在谷歌上搜索它的时候,我找不到任何详细的解释,除了一个用Clojure写的例子(我看不懂)。
发布于 2016-09-12 02:20:47
a
和b
在宏定义中出现两次。因此,如果您将其与具有副作用的参数一起使用,则副作用将执行两次。
max(++i, 4);
如果调用前为i = 4
,则返回6。由于这不是预期的行为,因此您应该更倾向于使用内联函数来替换像max
这样的宏。
发布于 2016-09-12 02:21:16
考虑以下表达式:
x = max(Foo(), Bar());
其中Foo
和Bar
如下所示:
int Foo()
{
// do some complicated code that takes a long time
return result;
}
int Bar()
{
global_var++;
return global_var;
}
然后在原始的max
表达式中展开如下:
Foo() > Bar() ? Foo() : Bar();
在这两种情况下,Foo或Bar都将执行两次。从而花费比所需时间更长的时间或者改变程序状态的次数超过预期的次数。在我的简单Bar
示例中,它不会始终返回相同的值。
https://stackoverflow.com/questions/39439181
复制相似问题