5

我对 C++ 的基础知识相当熟悉,但缺乏经验(主要是 Java 代码),所以稍微“笨拙”的回复将不胜感激:)

我正在扩展一个更大的开源项目,它使用标准的 Visual Studio 类limits.h,其中可以找到以下代码:

template<> class numeric_limits<double>
    : public _Num_float_base
    {   // limits for type double
public:
    typedef double _Ty;

    static _Ty (max)() _THROW0()
    {   // return maximum value
        return (DBL_MAX);
    }

我现在导入了另一个开源项目,它使用了 minwindef.h,其中包含以下代码:

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

构建现在中断,因为对于这条线

SUMOReal distance = std::numeric_limits<SUMOReal>::max();

编译器抱怨在没有任何参数的情况下使用 max()。有什么快速的方法可以解决这个问题,或者我可以不使用我导入的库吗?:/

希望这足够清楚,感谢您的任何建议!

4

3 回答 3

4

解决这个问题的唯一方法是#undef使用宏。

这就是传统上宏都用大写字母拼写的原因之一,而系统和标准函数都是小写的。

于 2013-10-16T17:10:51.773 回答
4

您可以阻止 C++ 预处理器为特定代码行扩展max宏,然后在该行之后重新启用它。此解决方案不会影响代码的其他部分(即,如果其他max地方需要宏):

#pragma push_macro("max")
#undef max
SUMOReal distance = std::numeric_limits<SUMOReal>::max();
#pragma pop_macro("max")
于 2013-10-16T17:13:48.850 回答
3

在你的编译器设置中,已经NOMINMAX定义好了。这将阻止 Windows 标头尝试定义minmax宏。这是处理此问题的正确方法;尝试#undef它是不可靠且容易出错的。搜索NOMINMAX有关此标志的更多信息。

您也可以在紧要关头这样做,但不要养成习惯:

SUMOReal distance = (std::numeric_limits<SUMOReal>::max)();
于 2013-10-16T17:14:42.233 回答