具有 min()/max() 调用的代码出现奇怪的 C++ 错误

Posted

技术标签:

【中文标题】具有 min()/max() 调用的代码出现奇怪的 C++ 错误【英文标题】:Strange C++ errors with code that has min()/max() calls 【发布时间】:2010-09-06 01:30:49 【问题描述】:

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

【问题讨论】:

这是 Stack Overflow 上最奇怪的问题 【参考方案1】:

检查您的代码是否包含 windows.h 头文件,并且您的代码或其他第三方头文件有自己的 min()/ma​​x () 定义。如果是,则在您的 windows.h 包含之前添加 NOMINMAX 的定义,如下所示:

#define NOMINMAX
#include <windows.h>

【讨论】:

【参考方案2】:

另一种可能是副作用。大多数最小/最大宏将多次包含参数,并且可能无法达到您的预期。也可能产生错误和警告。

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

之后 i 要么加 1 要么加 2

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

【讨论】:

【参考方案3】:

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

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

这是因为宏 min() 仅在 min 后跟 ( 时展开,而不是在 &lt; 后边时展开。

【讨论】:

【参考方案4】:

呃...范围吧,伙计:std::min()std::max()

【讨论】:

您仍然需要#define NOMINMAX 否则预处理器仍会扩展最小值和最大值。【参考方案5】:

我已经好几年没用过了,但是从内存提升中也可以分配最小值和最大值,可能吗?

【讨论】:

【参考方案6】:

老实说,当谈到最小值/最大值时,我发现最好自己定义:

#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))

【讨论】:

坦率地说,这是自找麻烦。在 C++ 中,使用 using std::swap 并在您可以做得比默认值更好时编写自己的交换。在 C 语言中,至少要写 #define min(a,b) ((a) &lt; (b) ? (a) : (b)) 并确保你不要用任何有副作用的东西来称呼它,因为你会有多重评估。

以上是关于具有 min()/max() 调用的代码出现奇怪的 C++ 错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 具有空字段的 MIN 和 MAX 值

Max-Min和Min-Min算法实现

生成具有给定元素数量和错误级别的已定义 Min、Max、Mean 和 Stdev 的随机数数组

如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID

列表的最小值和最大值(不使用 min/max 函数)

当出现故障时,获取时间戳中的 Min 和 MAX 行