C++ 宏与成员函数冲突

C++ 宏与成员函数冲突,c++,C++,我的问题是,std::numeric_limits::min()与“windef.h”中定义的“min”宏冲突。有没有办法在不取消定义“min”宏的情况下解决此冲突。 下面的链接给出了一些提示,但是我无法将括号与静态成员函数一起使用 提前谢谢。是的,我遇到了同样的问题。我只找到了一个解决方案: #ifdef min #undef min #endif //min 将其放在包含完成后。唯一真正通用的解决方案是在标题中不包含windows.h 这个头是一个杀手,它几乎可以做任何事情让你的代码爆炸

我的问题是,std::numeric_limits::min()与“windef.h”中定义的“min”宏冲突。有没有办法在不取消定义“min”宏的情况下解决此冲突。 下面的链接给出了一些提示,但是我无法将括号与静态成员函数一起使用


提前谢谢。

是的,我遇到了同样的问题。我只找到了一个解决方案:

#ifdef min
#undef min
#endif //min

将其放在包含完成后。

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

这个头是一个杀手,它几乎可以做任何事情让你的代码爆炸。如果不启用MSVC语言扩展,它将无法编译,这是我见过的最糟糕的宏滥用示例

将其包含在单个.cpp文件中,然后在头文件中公开包装器,其余代码都可以使用。如果windows.h不可见,则它不能与您的名称冲突


具体来说,对于最小/最大情况,您可以在包含windows.h之前定义NOMINMAX。然后它将不定义那些特定的宏。

除了jalf的答案,您还可以在包含WINDOWS.h之前定义WINDOWS和。它将从windows标题中去除最小值、最大值和更多噪声

杜菲, 该解决方案的问题是,如果您需要使用宏后置码

我甚至尝试了定义NOMINMAX,但没有成功

我找到的最佳解决方案是Johannes Schaub提供的:
(std::numeric_limits::min)(

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


它允许您包括
windef.h
,不需要您
\undef max
(这可能会产生不良副作用),也不需要
\define NOMINMAX
。工作起来很有魅力

投票通过了,因为我们在这里得出了相同的结论。除其他缺点外,它为每个对象文件增加了约19K。我们刚刚创建了自己的头文件,其中包含了windows.h中通常需要的一些内容。这是一个典型的Microsoft解决方案。。。“我们的宏造成了麻烦?好吧,我们只需要添加一个宏来禁用它们!”@实际上,windows.h是在很久以前实现的,远远早于std::min(或任何其他标准的min/max)的创建。通过删除windows.h的最小/最大值来更改它们会破坏太多的代码。微软(几乎)总是在警告方面犯错误:如果你不需要min/max,你可以告诉它NOMINMAX。(这并没有解决他们用非大写字母定义宏的原始问题。)@mos:我知道,但正如你所指出的,根本问题是他们一开始就给宏起了可笑的坏名字。更糟糕的是,当他们添加unicode支持时,他们决定创建数百个新的命名错误的宏。他们显然没有从min/max中学到任何东西。用std::min替换windows中的宏
min
,将使windows工作得更快;)<代码>最小值
宏计算最小值两次。同样适用于
max
宏。为什么括号技巧对您不起作用?请记住将其包装在整个表达式中,如
(std::numeric_limits::min)(
中所示,这是有效的。非常感谢。请将其作为答案发送,我愿意接受。非常感谢,不敢相信在有人提出这件事之前,我已经在#undef's上混了很多年…@Johannes Schaub-litb:请将您的评论作为答案发送,我愿意接受。@Johanneschaub litb我在接受的答案中所做的投票应该是给您的,不适合其他人,他们两年后的回答与你的评论完全相同。谢谢。但是在我的项目中,这让人更头疼。请注意,
#ifdef
是不必要的。对于未定义为宏的名称,
#undef
是可以的,因此无论是否定义了
min
#undef min
都是安全的。据我所知,它首先处理括号中的值。宏还接受两个参数,但将函数括号括起来不会向宏显示任何参数。