2016-08-02 3 views
1

いくつかのデバッグ出力ステートメントを大きなCコードベースに挿入します。これらのデバッグ出力ステートメントは、コンパイラオプションスイッチによって制御されます。`#ifdef ... #endif`マクロブロックに展開されるCマクロを書くには?

デバッグ出力文は次のようになります。いくつかの入力を保存するには

#ifdef DEBUG_FLAG 
Print(someSymbol) 
#endif 

デバッグ出力ステートメントブロックの上に展開され、簡単なマクロを定義することが可能であるならば、私は疑問に思って?例えば

#define DBG_MACRO(someSymbol) (something that can expand to above) 
+0

これは、別のマクロそのものの代入値がコンパイル時エラーにつながるため、これを行うことはできません。 – sjsam

+0

[関連](http://stackoverflow.com/q/283​​1934/335858) – dasblinkenlight

+1

デバッグ印刷にマクロを使用する場合は、デバッグ印刷用に[C '#define'マクロをチェックアウトしてください(http:// stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/)。これを複製してこれを閉じることは、少なくとも幾分魅力的です。 –

答えて

7

あなたはプリプロセッサマクロ内のプリプロセッサディレクティブを置くことはできません。

しかし、何も何にも展開されるマクロを定義するからあなたを停止しない:

#ifdef DEBUG_FLAG 
# define Print(x) Print(x) 
#else 
# define Print(x) 
#endif 

// Expands to an empty statement if DEBUG_FLAG were not set and 
// to a call to Print(something) if DEBUG_FLAG were set. 
Print(something); 

上記すでに定義/宣言された関数であるPrintに依存します。マクロがDEBUG_FLAGに設定されている場合、マクロは "置き換えられ"ますが、Cプリプロセッサの展開は再帰的ではないので、展開は一度しか行われず、結果としてPrintが呼び出されます。

5

このようにすることはできません。ただし、条件付きでマクロを定義するのは簡単です。

関連する問題