• 締切済み

可変長引数関数のマクロ関数について

可変長引数をとる関数をマクロで置き換えたいのですが、 この方法だとできません。うまく実現できないでしょうか? ------------------------------------------------------- #define TRACE(arg, ...) trace(__FILE__,__LINE__,arg, ...) void trace(char *file, int line, char *arg, ...) {   ...(略)... } func() {   ...   TRACE("hello %s", "taro");   ... } ------------------------------------------------------- よくあるトレース処理だと思いますがこんな感じです。 他にも代替手段は考えつきますが、 可変長引数の関数のマクロが可能かが知りたいです。 どなたがご存知の方がいらっしゃいましたら、よろしくお願いします。

みんなの回答

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> 可変長引数をとる関数をマクロで置き換えたい いわゆる「一般的なC言語」では、できません。ただ、つい最近 C言語の 規格が新しくなりました(C99)。 その規格では、可変長引数を取るマクロが使えます。こんな感じ。 #define TRACE(fmt, ...) trace(__FILE__,__LINE__,fmt,__VA_ARGS__) void trace(char* file, int line, char* fmt, ...) 古い規格のCでtraceの活殺をしたければ、trace関数内を #ifdef ~ #endif で 括るしかないです。 void trace(char* file, int line, char* fmt, ...) { #ifdef DEBUG   ... #endif } 実行環境や使い方にもよりますが、関数呼出しのオーバーヘッドをそれほど 気にする必要はありませんよ。以下のような感じでも十分実用的です。 void trace(char* file, int line, char* fmt, ...) {   if (デバッグ出力をしない?) return;   ... (以下、デバッグ出力) } で、直接 trace をプログラムでは使う。

関連するQ&A