当前位置:  开发笔记 > 编程语言 > 正文

宏和成员函数冲突

如何解决《宏和成员函数冲突》经验,为你挑选了2个好方法。

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

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

先感谢您.



1> Kiril..:

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

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


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

2> jalf..:

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

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

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

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


好吧,这是一个典型的微软解决方案......"我们的宏造成了麻烦?好吧,我们只需添加一个宏来禁用它们!" ;)
@mos:我知道,但正如你所指出的那样,根本问题在于他们以*为开头给出了可怕的糟糕名字*.更糟糕的是,当他们添加unicode支持时,他们决定创建数百个*新的*命名错误的宏.他们显然没有从min/max学到任何东西.
好答案.不知道那个'NOMINMAX`的诡计.
推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有