当min被定义为宏时,如何调用std :: min()?

Meh*_*dad 36 c++ macros stl

std::min如果min已经定义为宏,我该如何调用?

Joh*_*åde 87

(std::min)(x,y)
Run Code Online (Sandbox Code Playgroud)

括号围绕min防止宏扩张.这适用于所有函数宏.

  • @安德烈:是的.调用这样的函数在`[n3290:3.4.2]`中给出了一个例子,很明显这会阻止宏扩展(C99中的`6.10.3/10`;我确信这里的措辞是附近的C90). (5认同)

And*_*hko 15

在Windows上,您需要NOMINMAX在包含任何Windows标头之前进行定义,最好在预编译标头的开头.更多信息在这里

  • @Mehrdad:包括Windows标题已经不可移植了. (4认同)
  • 也可以在项目文件中使用/ D NOMINMAX命令行选项.如果您没有PCH,这是一个有用的替代方案. (3认同)

And*_*ron 6

#undef min#include <>指令之后,在代码中使用.

#include <...> // bad header that defines `min` macro
#ifdef min
#undef min
#endif

// rest f code.
Run Code Online (Sandbox Code Playgroud)

附录:如果您之后需要保留min宏的值,可以在某些编译器上使用非便携式解决方案暂时禁用其定义.例如,微软的C++编译器有一个push_macropragma,似乎也得到了GCC的支持.

  • @Mehrdad:`min`作为一个宏是一个开始的黑客.最好避免它.如果你真的想要一个宏,请使用一个名为`MIN`或其他不会发生碰撞的东西. (2认同)