Visual Studio C错误-宏“max”需要2个参数,但只给出了1个参数

bpsygsoo  于 2023-06-24  发布在  其他
关注(0)|答案(4)|浏览(250)

在尝试编译下面的代码时:

template <class T>
struct scalar_log_minimum {
    public:
        typedef T value_type;
        typedef T result_type;
        static
            result_type initial_value(){
                return std::log(std::numeric_limits<result_type>::max());
        }
        static
            void update(result_type& t, const value_type& x){
                if ( (x>0) && (std::log(x)<t) ) t = std::log(x);
        }
    };

我得到了以下错误:
functional_ext.hpp:55:59: macro "max" requires 2 arguments, but only 1 given
这里的“max”不是宏,对吧?那么这个错误是什么呢?顺便说一句,我正在使用Visual Studio 2005。
55:59是什么意思?55是第59行。

jmp7cifd

jmp7cifd1#

我发现你在包含windows.h后遇到的许多#defines非常令人不安(不仅是max和min,如果我没有弄错的话,我还遇到了其他通用词如Rectangle的问题)。因此,我养成了只在绝对必要时才包含windows.h的习惯,并且从不在头文件中包含。这将痛苦减少到少量特定于平台的C++文件。
不幸的是,一些boost库(我相信thread和asio)确实在它们的头文件中包含了windows.h,我仍然不时地遇到这种愚蠢的问题。
我的解决方案是在包含头文件之后#undef有问题的符号。

ahy6op9u

ahy6op9u2#

您在#definemax中包含了一个头文件作为宏。最好的解决方案是找出它是在哪里定义的,如果可能的话,禁止它被定义。或者,您可以只#undef它:

#include <evil_header_which_defines_max.h>
#undef max
5f0d552i

5f0d552i3#

正如其他人所指出的,包含windows.h可能是您的问题。微软提供了一种方法来“关闭”部分windows.h与预处理器符号。您可以将这些符号定义为构建的一部分,也可以直接在代码中定义。
使用预处理器符号来有条件地跳过windows.h的部分可能会被认为是优雅的,也可能不会被认为是优雅的,但在一般情况下,它是比#undef更容易,更通用和更可扩展的解决方案。
以下是如何跳过定义minmax作为宏:

#define NOMINMAX
#include <windows.h>

请注意,许多包含文件在某些时候会包含windows.h。在这种情况下,在更全局的级别设置定义可能更方便。
如果你搜索windows.h,你可以找到一堆其他的预处理器符号(例如,NOOPENFILENOKANJINOKERNEL和许多其他符号),这些符号通常是有用的。

6ie5vjzr

6ie5vjzr4#

这是一个名为max的宏,正如Adam解释的那样。另一种解决方案(更像是“hotfix”)可能是在函数周围加上括号,以防止它被视为宏调用:

return std::log((std::numeric_limits<result_type>::max)());

相关问题