c ++中的预处理器宏覆盖函数定义

时间:2013-10-16 17:08:06

标签: c++ function overloading precompiler

我对C ++的基础知识相当熟悉,但缺乏经验(主要是Java代码),所以会有点“愚蠢”的回复:)

我正在扩展一个更大的开源项目,该项目使用标准的visual studio class 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()。 有没有快速解决此问题的方法,或者我可以简单地不使用我导入的库? :/

希望这很清楚,感谢任何建议!!

3 个答案:

答案 0 :(得分:3)

解决问题的唯一方法是#undef宏。

这是传统上拼写所有UPPER_CASE字母的原因之一,而系统和标准函数都是小写的。

答案 1 :(得分:3)

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

#pragma push_macro("max")
#undef max
SUMOReal distance = std::numeric_limits<SUMOReal>::max();
#pragma pop_macro("max")

答案 2 :(得分:2)

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

你也可以这样做,但不要养成习惯:

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