在尝试编译下面的代码时:
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行。
4条答案
按热度按时间jmp7cifd1#
我发现你在包含windows.h后遇到的许多#defines非常令人不安(不仅是max和min,如果我没有弄错的话,我还遇到了其他通用词如Rectangle的问题)。因此,我养成了只在绝对必要时才包含windows.h的习惯,并且从不在头文件中包含。这将痛苦减少到少量特定于平台的C++文件。
不幸的是,一些boost库(我相信thread和asio)确实在它们的头文件中包含了windows.h,我仍然不时地遇到这种愚蠢的问题。
我的解决方案是在包含头文件之后#undef有问题的符号。
ahy6op9u2#
您在
#define
的max
中包含了一个头文件作为宏。最好的解决方案是找出它是在哪里定义的,如果可能的话,禁止它被定义。或者,您可以只#undef
它:5f0d552i3#
正如其他人所指出的,包含
windows.h
可能是您的问题。微软提供了一种方法来“关闭”部分windows.h
与预处理器符号。您可以将这些符号定义为构建的一部分,也可以直接在代码中定义。使用预处理器符号来有条件地跳过
windows.h
的部分可能会被认为是优雅的,也可能不会被认为是优雅的,但在一般情况下,它是比#undef
更容易,更通用和更可扩展的解决方案。以下是如何跳过定义
min
或max
作为宏:请注意,许多包含文件在某些时候会包含
windows.h
。在这种情况下,在更全局的级别设置定义可能更方便。如果你搜索
windows.h
,你可以找到一堆其他的预处理器符号(例如,NOOPENFILE
,NOKANJI
,NOKERNEL
和许多其他符号),这些符号通常是有用的。6ie5vjzr4#
这是一个名为
max
的宏,正如Adam解释的那样。另一种解决方案(更像是“hotfix”)可能是在函数周围加上括号,以防止它被视为宏调用: