传统 C++ 中的最小值和最大值

Posted

技术标签:

【中文标题】传统 C++ 中的最小值和最大值【英文标题】:min and max in legacy C++ 【发布时间】:2016-05-26 06:01:09 【问题描述】:

我正在尝试在 Debian GNU/Linux 稳定系统上编译一些较旧的 C++ 代码(可能在 2001-2002 年左右)。编译时出现错误:

In file included from /usr/include/c++/4.7/vector:66:0,
                 from ../FooMath/FooBar.h:23,
                 from FooBar.cpp:2:
/usr/include/c++/4.7/bits/stl_bvector.h: In member function ‘std::vector<bool, _Alloc>::size_type std::vector<bool, _Alloc>::max_size() const’:
/usr/include/c++/4.7/bits/stl_bvector.h:685:2: error: ‘max’ is not a member of ‘__gnu_cxx::__numeric_traits<long int>’

为了解决这个问题,我在我们自己的一个头文件中发现了这段代码,我认为这与这个问题有关:

#if defined(IRIX) | linux
signed  max(signed a, signed b);
long    max(long a, long b);
double  max(double a, double b);
float   max(float a, float b);
signed  min(signed a, signed b);
long    min(long a, long b);
double  min(double a, double b);
#define  __min min
#define  __max max
float   min(float a, float b);
#endif

在许多其他地方,我看到对带有两个参数的 __max() 函数的调用。

我有根据的猜测是,我可以将所有这些对__max() 的调用替换为对std::max() 的调用,并且我应该包含&lt;algorithm&gt; 标头。

我的两个问题是:

    我有根据的猜测是否正确? 我假设 min 和 max 的额外声明和定义是一些历史遗留问题。有人知道它的历史吗?为什么需要这段代码?

【问题讨论】:

从错误信息来看,max 似乎与en.cppreference.com/w/cpp/types/numeric_limits/max 相关,而不是来自算法。 您应该发布一个 MCVE。最可能的解释是您的代码中存在错误。 希望您不要编辑系统标题。 以双下划线开头的标识符保留给实现。将代码中的所有双下划线内容替换为单下划线或其他内容。 您是否在代码中任何位置的标准库头文件之前包含您自己的头文件? 【参考方案1】:

bits/stl_bvector.h 的第 685 行,您有:

    __gnu_cxx::__numeric_traits<difference_type>::__max

您的丑陋宏正在将__max 替换为max,因此出现错误。

您可以将代码中的所有__max 有效地替换为std::max,但为了确保不要拆除所有内容,您可以先将__max 重命名为__my__max,以确保(在您的宏中也)。这样你就可以继续使用自定义的 min/max 函数了。


另一种解决方案是 undef 您的宏,然后再包含 stl 标头并在之后重新启用它。

【讨论】:

问题是,我们不知道丑陋的宏是否在标准库实现文件中。问题中没有足够的信息。 是的,你是对的,“某个头文件”不是很清楚。 “某个头文件”其实是我们自己的头文件之一,不是系统头文件。我在问题中改变了它,tnx。

以上是关于传统 C++ 中的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章

数组中的 Java 最小值和最大值

查找金属纹理中的最小值和最大值

从Awk中的多维数组中的子数组获取最小值和最大值

如何显示列表中的最小值和最大值?

获取数组列中的最小值和最大值

Javascript:使用 reduce() 查找最小值和最大值?