我有问题,std :: numeric_limits :: min()与“windef.h”中定义的“min”宏冲突。有没有办法解决这个冲突而不取消定义“min”宏。 下面的链接提供了一些提示,但我无法使用带有静态成员函数的括号。
What are some tricks I can use with macros?
提前谢谢。
答案 0 :(得分:31)
解决方法是使用括号:int max = (numeric_limits<int>::max)();
它允许您添加windef.h
,不需要您#undef max
(可能会产生不良副作用),而且不需要#define NONIMAX
。像魅力一样工作!
答案 1 :(得分:23)
唯一真正通用的解决方案是不在标题中包含windows.h 。
这个标题是一个杀手,它可以做任何事情来使你的代码爆炸。如果没有启用MSVC语言扩展,它将无法编译,这是我见过的最糟糕的宏滥用示例。
将其包含在单个.cpp文件中,然后在标题中公开包装,其余代码可以使用。如果windows.h不可见,则不会与您的名字冲突。
具体来说,对于最小/最大情况,您可以在包含windows.h之前#define NOMINMAX
。然后它不会定义那些特定的宏。
答案 2 :(得分:1)
#ifdef min
#undef min
#endif //min
包括完成后立即放置。
答案 3 :(得分:1)
除了jalf的回答之外,在包含windows.h之前,您还可以#define WINDOWS_LEAN_AND_MEAN
。它将摆脱最小,最大和一些来自Windows标头的噪音。
答案 4 :(得分:1)
Dewfy, 该解决方案的问题在于您是否需要使用宏后期。
我甚至尝试过定义的NOMINMAX,但它没有用。
我发现的最佳解决方案是来自Johannes Schaub的解决方案: (std :: numeric_limits :: min)()