Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c+;中的预处理器宏重写函数定义+; 我比较熟悉C++的基础知识,但缺乏经验(主要是java语言),所以稍微“哑”的回答会被理解:_C++_Function_Overloading_Precompiler - Fatal编程技术网

c+;中的预处理器宏重写函数定义+; 我比较熟悉C++的基础知识,但缺乏经验(主要是java语言),所以稍微“哑”的回答会被理解:

c+;中的预处理器宏重写函数定义+; 我比较熟悉C++的基础知识,但缺乏经验(主要是java语言),所以稍微“哑”的回答会被理解:,c++,function,overloading,precompiler,C++,Function,Overloading,Precompiler,我正在扩展一个更大的开源项目,该项目使用标准的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() { //

我正在扩展一个更大的开源项目,该项目使用标准的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);
    }
构建现在中断,因为对于这一行

SUMOReal distance = std::numeric_limits<SUMOReal>::max();
SUMOReal distance=std::numeric_limits::max();
编译器抱怨使用max()时没有任何参数。 有没有什么快速的方法来解决这个问题,或者我可以不使用我导入的库吗/


希望这足够清楚,谢谢你的建议

解决此问题的唯一方法是取消宏的定义


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

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

#pragma push_宏(“max”)
#未定义最大值
总和距离=标准::数值限制::最大值();
#pragma pop_宏(“max”)

在编译器设置中,定义
NOMINMAX
。这将阻止Windows标题尝试定义
min
max
宏。这是正确的处理方式,;试图
#undef
不可靠且容易出错。有关此标志的详细信息,请搜索
NOMINMAX

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

SUMOReal distance = (std::numeric_limits<SUMOReal>::max)();
SUMOReal distance=(标准::数值限制::最大值)();

我的朋友,这就是为什么不应该使用宏的原因,如果使用宏,宏应该有可怕的名称,表明其可怕的性质头文件定义了
min
max
是一种罪恶,永远不应该使用。@Walter同意。这就是为什么您总是在Windows下使用
/DNOMINMAX
进行编译。(这些宏是一个历史工件,它们仍然存在,以避免破坏使用它们的遗留代码。你不应该在新代码中使用它们。)@jrok-Yup,绝对重复。看起来我在搜索错误的内容…宏是在Windows标头中有条件地定义的。用正确的选项编译就足够了,这样它就会消失。@JamesKanze我强烈反对。深入了解由其他头文件递归包含的头文件的详细信息是不明智的
#undef
ing宏完全可以。我必须同意@Walter和这个答案。@Walter这是
#undef
解决方案,需要深入了解头文件的细节(我需要它吗,等等)。只要设置正确的编译器标志(如Microsoft所记录的),它就可以工作。@Walter:很容易忘记,很容易放错位置,而且每次编写一个顶级定义时都会产生不必要的开销。请注意,如果您使用的是VS,它会出现在属性页的“配置属性”-->C/C++->Preprocessor;只需将其添加到预处理器定义字段。@JamesKanze我不使用VS,但在其他地方遇到了这样的宏定义。它们可能非常烦人,尤其是因为产生的编译器错误消息毫无意义。@Walter我知道你的意思:我记得当
定义了宏
字符串时。使用USL进行编译非常痛苦。今天,如果一个库定义这样的宏不是出于历史原因,并且没有一个文档化的方法来关闭它们,我会说不要使用它。但这里的情况并非如此:所讨论的标题是一个Windows标题,Microsoft记录了您应该如何避免该问题。这很好。我不知道,这很漂亮!虽然我选择了另一个答案,因为它看起来像是一个更干净的解决方案,但我真的不想太多地干扰项目的常规设置,所以我现在将使用它。谢谢这是C++预编译器的一个很好的特性。
#pragma push_macro("max")
#undef max
SUMOReal distance = std::numeric_limits<SUMOReal>::max();
#pragma pop_macro("max")
SUMOReal distance = (std::numeric_limits<SUMOReal>::max)();