宏和成员函数冲突

时间:2009-09-08 13:46:32

标签: c++

我有问题,std :: numeric_limits :: min()与“windef.h”中定义的“min”宏冲突。有没有办法解决这个冲突而不取消定义“min”宏。 下面的链接提供了一些提示,但我无法使用带有静态成员函数的括号。

What are some tricks I can use with macros?

提前谢谢。

5 个答案:

答案 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)()