2011-09-16 6 views

答えて

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

min周りの括弧はマクロ展開を防ぎます。これはすべての関数マクロで機能します。

+2

Genius。私は残念ながら投票を外しています –

+1

:あなたはGENIUSです!それは素晴らしいです、ありがとう! :D – Mehrdad

+0

この標準的な動作ですか? –

6

指令の後にコードに#undef minを使用してください。

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

// rest f code. 

補遺:あなたはその後minマクロの値を保持する必要がある場合、あなたはいくつかのコンパイラの非ポータブルソリューションを使用して、一時的にその定義を無効にすることができます。例えば、MicrosoftのC++コンパイラはと思われるpush_macro pragmaを持っています。

+0

ああ、私は本当にそれをすることはできません。なぜなら何らかの理由でマクロに依存する可能性があるすべてのことを後悔してしまうからです。実際の解決策ではなく、むしろ貧弱なハックです。 :\ – Mehrdad

+2

@Mehrdad:マクロとしての 'min'は、まずはハックです。それを避けるのがベストです。本当にマクロが必要な場合は、「MIN」という名前のものや、衝突しないものを使用してください。 – hammar

+1

@Mehrdad:一時的に無効にするための解決策を掲載しました。しかし、マクロが定義されている場合、テキスト置換はプリプロセッサによって行われ、コンパイラに置き換えられているように、言語が明確に述べているので、ポータブルな解決策はありません。関数の最小値とマクロの最小値を区別するために使用できるC++言語構造はありません。 –

14

Windowsでは、ウィンドウヘッダーを含める前にNOMINMAXを定義する必要があります。これは、プリコンパイル済みヘッダーの先頭に配置することをお勧めします。 More info here

+0

クール!ポータブルではありませんが、私はまだそれが好きです。 +1。 :) – Mehrdad

+3

@Mehrdad:Windowsヘッダーを含めて、それはすでに持ち運びできません。 –

+0

@Andre:私はそれがまさに私がまだ好きだと言っていることに同意します。:P – Mehrdad

4

あなたは、マクロ定義を避けることができるかもしれない:最初の場所(いずれかのような問題のあるヘッダを含む#define NOMINMAX又は類似または回避するように構成することによって) に定義を避ける

  • #undef

これらのオプションを使用できない場合やそれらを使用したくない場合は、括弧を適切に使用して関数型マクロを呼び出すことを避けることができます。

#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) 
関連する問題