【问题标题】:macro and member function conflict宏和成员函数冲突
【发布时间】:2010-11-26 12:28:01
【问题描述】:

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

What are some tricks I can use with macros?

提前谢谢你。

【问题讨论】:

  • 为什么括号技巧对你不起作用?请记住将其包裹在整个表达式中,如(std::numeric_limits<T>::min)()
  • 这行得通。谢谢你。请将其作为答案发送,我愿意接受。
  • 非常感谢,真不敢相信在有人提出这个问题之前,我已经在 #undef's 上苦恼多年了...
  • @Johannes Schaub - litb:请将您的评论作为答案发送,我愿意接受。
  • @JohannesSchaub-litb 我在接受的答案中所做的支持应该是给你的,而不是给两年后完全按照你的评论做出答案的人。

标签: c++


【解决方案1】:

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

它允许您包含windef.h,不需要您添加#undef max(可能有不良副作用)并且不需要#define NOMINMAX。像魅力一样工作!

【讨论】:

  • 据我了解,它首先处理括号中的值。该宏还接受两个参数,但将函数括号括起来它不会向宏显示任何参数。
【解决方案2】:

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

该标头是一个杀手,并且几乎可以使您的代码崩溃。如果不启用 MSVC 语言扩展,它将无法编译,这是我见过的最糟糕的宏滥用示例。

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

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

【讨论】:

  • 投了赞成票,因为我们在这里得出了相同的结论。除了其他弊端之外,它增加了大约 19K 每个目标文件。我们刚刚创建了自己的头文件,其中包含我们通常需要的 windows.h 中的一些内容。
  • 嗯,这是一个典型的 Microsoft 解决方案......“我们的宏造成了麻烦?好吧,我们将添加一个宏来禁用它们!” ;)
  • @jalf 实际上,windows.h 是在很久以前实现的,远在创建 std::min (或任何其他标准 min/max)之前。通过删除它们的最小值/最大值来更改 windows.h 会破坏太多代码。微软(几乎)总是在谨慎方面犯错:如果您不需要最小值/最大值,您可以告诉它 NOMINMAX。 (这并没有解决他们用非大写字母定义宏的原始问题。)
  • @mos:我知道,但正如你所指出的,根本问题是他们给宏起名 荒谬可笑。更糟糕的是,当他们添加 unicode 支持时,他们决定创建数百个 new 命名错误的宏。他们显然没有从 min/max 中学到任何东西。
  • 用 std::min 替换 windows.h 中的宏 min 将使 Windows 工作得更快 ;) min 宏计算最小值两次。 max 宏也一样。
【解决方案3】:

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

#ifdef min
#undef min
#endif //min

在包含完成后立即放置。

【讨论】:

  • 请注意,#ifdef 是不必要的。 #undef 可以使用未定义为宏的名称,因此 #undef min 是安全的,无论是否定义了 min
【解决方案4】:

除了 jalf 的回答,您还可以在包含 windows.h 之前#define WINDOWS_LEAN_AND_MEAN。它将摆脱 Windows 标题中的最小值、最大值和更多噪音。

【讨论】:

  • 谢谢。但是在我的项目中,这更让人头疼。
【解决方案5】:

露水, 该解决方案的问题在于您是否需要使用宏后院。

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

我找到的最佳解决方案来自 Johannes Schaub: (std::numeric_limits::min)()

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 2011-01-18
    • 2015-02-26
    • 2011-04-15
    • 2012-06-19
    • 1970-01-01
    • 2015-10-23
    • 2019-11-23
    相关资源
    最近更新 更多