使用min()/max()函数的C++代码出现奇怪的错误

7

当我的C++代码使用min()或max()函数时,我看到一些奇怪的错误。我正在使用Visual C++编译器。


5
这正式成为 Stack Overflow 上最奇怪的问题。 - eplawless
6个回答

18

检查你的代码是否包含 windows.h 头文件,并且你的代码或其他第三方头文件中是否有自己的 min()/max() 定义。如果是,则在你的 windows.h 引用之前添加一个 NOMINMAX 的定义,像这样:

#define NOMINMAX
#include <windows.h>

2

由于Windows将此定义为函数式宏,因此可以使用以下解决方法:

int i = std::min<int>(3,5);

这个方法的原理在于宏min()只有在后面跟着(时才会被扩展,而不是跟着<

2

可能还有一种可能是来自副作用。大多数最小/最大宏将多次包含参数,可能不会产生您预期的结果。也可能会生成错误和警告。

max(a,i++)展开为((a) > (i++) ? (a) : (i++))

之后i要么加1要么加2。

展开中的()是为了避免在使用公式调用时出现问题。尝试展开max(a,b+c)。


0
呃...理清作用域,老兄:std::min()std::max()

5
如果你不使用 #define NOMINMAX,预处理器仍会扩展 min 和 max。 - Ferruccio

0

我已经好几年没用它了,但是从记忆中boost也会分配最小值和最大值,可能吧?


-1
说实话,当涉及到最小/最大值时,我发现最好自己定义:
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))

4
说实话,这么做可能会带来麻烦。在C++中,使用 using std::swap,当你能做得比默认更好时,编写自己的 swap。在C语言中,至少要编写 #define min(a,b) ((a) < (b) ? (a) : (b)),并确保不要对具有副作用的任何内容进行调用,因为这会导致多次评估。 - David Thornley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接