宏和成员函数冲突

msh*_*msh 22 c++

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

我可以使用宏的一些技巧?

先感谢您.

Kir*_*ril 32

解决方法是使用括号: int max = (numeric_limits<int>::max)();

它允许你包括windef.h,不需要你#undef max(可能有不良的副作用),没有必要#define NONIMAX.奇迹般有效!

  • 据我了解,它首先处理括号中的值。该宏还带有两个参数,但是用括号括起来,它不会对宏显示任何参数。 (2认同)

jal*_*alf 23

唯一真正通用的解决方案是不在头文件中包含windows.h.

那个标题是一个杀手,它可以做任何事情来使你的代码爆炸.如果没有启用MSVC语言扩展,它将无法编译,这是我见过的最糟糕的宏滥用示例.

将其包含在单个.cpp文件中,然后在包含其余代码的标头中公开包装器.如果windows.h不可见,则不会与您的名字冲突.

对于min/max案例,你可以#define NOMINMAX在包括windows.h之前.然后它将不定义那些特定的宏.

  • 好吧,这是一个典型的微软解决方案......"我们的宏造成了麻烦?好吧,我们只需添加一个宏来禁用它们!" ;) (7认同)
  • @mos:我知道,但正如你所指出的那样,根本问题在于他们以*为开头给出了可怕的糟糕名字*.更糟糕的是,当他们添加unicode支持时,他们决定创建数百个*新的*命名错误的宏.他们显然没有从min/max学到任何东西. (4认同)
  • 好答案.不知道那个'NOMINMAX`的诡计. (2认同)