传统C ++中的min和max

时间:2016-02-15 10:53:36

标签: c++ linux algorithm max min

我正在尝试在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>标题。

我的两个问题是:

  1. 我的教育猜测是否正确?
  2. 我假设额外的声明和min和max的定义是一些历史遗留物。有谁知道它的历史?为什么需要这个代码?

1 个答案:

答案 0 :(得分:0)

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

    __gnu_cxx::__numeric_traits<difference_type>::__max

你丑陋的宏正在用__max替换max,因此错误。

您可以通过__max有效地替换代码中的所有std::max,但为了确保不删除所有内容,您可以先__max重新命名__my__max,只是为了确定(在你的宏中)。这样你就可以继续使用自定义的最小/最大函数。

在包含stl标头并重新启用它之前,另一个解决方案是undef你的宏。