マクロに基づいて条件付きでコードをコンパイルしたい。基本的に私は(実際のバージョンから簡体字)のように見えるマクロを持っています。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つの考えは、私がおそらく最適化コンパイラを悪用して、おそらくそれを使用することができるということです:それはブロックを完全にコンパイルするだけであることを信頼してください。他の解決策はありますか?
'if(0)'が問題ありません。 –