2011-09-10 11 views
4

マクロに基づいて条件付きでコードをコンパイルしたい。基本的に私は(実際のバージョンから簡体字)のように見えるマクロを持っています。C++マクロを条件付きでコンパイルするには?

#if DEBUG 
    #define START_BLOCK(x) if(DebugVar(#x) \ 
     { char debugBuf[8192]; 
    #define END_BLOCK() printf("%s\n", debugBuf); } 
#else 
    #define START_BLOCK(x) (void)0; 
    #define END_BLOCK() (void)0; 
#endif 

問題がDEBUGが定義されている場合は、同じようなことを行うことができることである:

START_BLOCK(test) 
    char str[] = "Test is defined"; 
    strcpy(debugBuf, str); 
END_BLOCK() 

START_BLOCK(foo) 
    char str[] = "Foo is defined"; 
    strcpy(debugBuf, str); 
END_BLOCK() 

そして、それぞれのために、すべてが正常に動作しますブロックはそれ自身のスコープ内にあります。しかし、DEBUGが定義されていない場合、2番目のブロックにはstrという再定義があります。 (まああなたも​​debugBufが定義されていません取得したいが、それはただ単純化された例の副作用です。)私が何をしたいのですがどのような

は#elseのようなものも持っていることです。

#else 
    #define START_BLOCK(x) #if 0 
    #define END_BLOCK() #endif 
#endif 

あるいは、開始/終了ブロックの間に何も持たない他の方法をコンパイルすることもできます。私は上記を試しましたが、私はまた、行に沿って何かを試しました:

#else 
    #define NULLMACRO(...) (void)0 
    #define START_BLOCK(x) NULLMACRO(
    #define END_BLOCK()) 
#endif 

無運なし。

これは機能する方法がありますか?ちょうど私に起こった1つの考えは、私がおそらく最適化コンパイラを悪用して、おそらくそれを使用することができるということです:それはブロックを完全にコンパイルするだけであることを信頼してください。他の解決策はありますか?

+2

'if(0)'が問題ありません。 –

答えて

5

したがって、独自の有効範囲を持つ条件ブロックが必要ですか?ここで

はそれを離れて最適化するために、コンパイラに依存している、非常に読みやすいソリューションです:

#define DEBUG 1 

#ifdef DEBUG 
    #define IFDEBUG(x) {x} 
#else 
    #define IFDEBUG(x) 
#endif 

IFDEBUG(
    // ... 
) 

、または手動:

#define DEBUG 1 

#ifdef DEBUG 
{ 
    // ... 
} 
#endif 

#define DEBUG 1 

if (DEBUG) { 
    // ... 
} 

そしてここでは、プリプロセッサだけのものです

+0

私は実際にあなたの中間の1つを実際に持っていた、問題はどのようにgcc対ビジュアルスタジオvar args 0または1 argと、私の単純化された例を覆わなかった、ダンを処理した。 –

+0

@ Doug-W:誰がvarargsについて話していますか? – orlp

+0

あなたの式にコンマが含まれていれば、中間のものは動作しません。そして、コードの長いブロックがカンマを含むのはかなり一般的です。その周りの1つの方法はvarargs(すべて、カンマおよびすべてを含む)ですが、varargsは議論の低いケースをうまく処理しません。 – AHelps

1

#if DEBUG 
    #define START_BLOCK(x) if(DebugVar(#x) \ 
     { char debugBuf[8192]; 
    #define END_BLOCK() printf("%s\n", debugBuf); } 
#else 
    #define START_BLOCK(x) { 
    #define END_BLOCK() } 
#endif 

do?

関連する問題