传统 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()
的调用,并且我应该包含<algorithm>
标头。
我的两个问题是:
-
我有根据的猜测是否正确?
我假设 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++ 中的最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章