2012-06-11 4 views
7

可能性の重複:
How to make a variadic macro (variable number of arguments)未定義のパラメータを受け入れるCマクロを使用できますか?

私はprintfに類似の引数を受け入れ、それらをログに記録し、基本的なCでのログマクロを持っていると思います。しかし、私はそれがどのようにログに記録される(ログレベル、ファイル対stderrなど)は、実行時ではなくコンパイル時に設定されることが必要です。メソッドは何もせず、低レベルのロギングを無視するようにパラメータを設定すると、うまくいけばコードから最適化されます。

これまでのところ、私はコンパイル時に定義されたパラメータに基づいて定義されたマクロを持っています。パラメータが定義されている場合、ログはログメソッド(ログに記録する)に、それ以外の場合はstderrに移動します。しかし、私はこのマクロに文字列を渡すことしかできません。 logメソッドは、無限の数の引数を取ることができ、printf構文を使用して動作します。マクロを設定する方法があるかどうかを知りたいので、ログファイルに不定数の引数を渡します。

私はそれができないと思うので、基本的なC(私はC++やブーストを使うことはできません)で必要なものを達成する別の方法があります。

答えて

7

C99には、可変数の引数を受け入れることができるマクロがあります。それらは可変マクロと呼ばれます。

http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

例:

#define eprintf(...) fprintf (stderr, __VA_ARGS__) 
#define dfprintf(stream, ...) fprintf(stream, "DEBUG: " __VA_ARGS__) 
2

はいすることができます。 C99はこれをサポートしていますout of the box

構文がどのように見える

:comp.lang.cよくある質問から

#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

関連する問題