2011-09-16 59 views

回答

75
(std::min)(x,y) 

各地min括号防止宏扩展。这适用于所有功能宏。

+2

天才。不幸的是,我的选票失控 –

+1

:你是天才!这太棒了,非常感谢! :D – Mehrdad

+0

这是标准行为吗? –

6

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

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

// rest f code. 

附录:如果你需要保持min宏的值之后,可以暂时使用一些编译器非便携式解决方案禁用它的定义。例如,微软的C++编译器有一个push_macro pragma,它似乎也是supported by GCC

+0

呃,我真的不能这么做,因为之后会因为某种原因而依赖于宏来干扰所有事情......这是一个相当糟糕的黑客攻击,而不是一个真正的解决方案。 :\ – Mehrdad

+2

@Mehrdad:'min'作为一个宏是一个开始。最好避免它。如果你真的想要一个宏,使用一个名为'MIN'或其他不会碰撞的东西。 – hammar

+1

@Mehrdad:改为临时禁用解决方案。但是,没有便携式解决方案,因为该语言明确指出,如果定义了宏,则文本替换将由预处理器完成,并且会替换为编译器。没有C++语言结构可以用来区分'min'函数和'min'宏。 –

14

在Windows上,您需要在包含任何Windows标头之前定义NOMINMAX,最好在预编译标头的开头。 More info here

+0

酷!不便携式,但我仍然喜欢它; +1。 :) – Mehrdad

+3

@Mehrdad:包括Windows头文件现在已经不可移植。 –

+0

@Andre:我同意,这就是为什么我说我仍然喜欢它。:P – Mehrdad

4

您可能能够通过避免宏定义:

  • #undef
  • 避免在首位的定义(或者通过配置如#define NOMINMAX或相似或避免包括违规报头)

如果这些选项不能使用或者你不想使用它们,你总是可以避免使用适当的parens来调用函数式宏:

#include <algorithm> 
#include <stdio.h> 

#define min(x,y) (((x) < (y)) ? (x) : (y)) 

int main() 
{ 
    printf("min is %d\n", (std::min)(3, 5)); // note: the macro version of `min` is avoided 
} 

这是便携式的,因为黑暗已先后C.

2

的初期,我发现了几个其他的方式来做到这一点:

方法1:

using std::min; 
min(a, b); // uses either the macro or the function (don't add side effects!) 

方法2:

#ifndef BOOST_PREVENT_MACRO_SUBSTITUTION 
#define BOOST_PREVENT_MACRO_SUBSTITUTION 
#endif 

... 
std::min BOOST_PREVENT_MACRO_SUBSTITUTION(a, b)