【问题标题】:Can't call std::max because minwindef.h defines "max" [duplicate]无法调用 std::max 因为 minwindef.h 定义了“max” [重复]
【发布时间】:2014-03-30 12:56:27
【问题描述】:

我将如何实际调用 std::max?该代码无法在 Visual Studio 2013 中编译,因为它采用“max”作为宏。

std::max( ... );

在“std::”之后需要一个标识符。

【问题讨论】:

  • 你加入了cmath吗? #include <cmath>
  • @user9000 std::max<algorithm> 中。问题是一个顽皮的 VS 宏。

标签: c++ macros std


【解决方案1】:

您可以取消定义宏:

#undef max

编辑:似乎可以通过放置来安全地禁用宏

#define NOMINMAX

在定义它们的头文件之前(很可能是windef.h,您可能间接包括在内)。

为避免取消定义宏,您可以简单地将函数包装在括号中

(std::max)(...)

正如 chris 在 cmets 中所指出的,类似函数的宏需要宏名称后的标记为左括号才能展开。将名称括在括号中实际上只是一种技巧,可以使下一个标记成为右括号,而一旦您将宏放在一边,就不会改变其含义。

【讨论】:

  • 这不会破坏依赖于 max 宏的东西吗?
  • @Ben 可能。我找到了一个副本,看看那个。你可能需要一些警卫来解决这个问题。我不使用VS所以不知道简单地取消定义的效果。
  • 好的,我定义了 NOMINMAX。完美运行。谢谢。
  • @Ben,您也可以使用(std::max)(...) 来避免取消定义。
  • @aquirdturtle,类似函数的宏需要宏名称后面的标记作为左括号才能展开。将名称括在括号中实际上只是一种技巧,可以使下一个标记成为右括号,而一旦您将宏放在一边,就不会改变含义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多