可変長引数をとる関数をマクロで置き換えたいのですが、
この方法だとできません。うまく実現できないでしょうか?

-------------------------------------------------------
#define TRACE(arg, ...) trace(__FILE__,__LINE__,arg, ...)

void trace(char *file, int line, char *arg, ...)
{
  ...(略)...
}

func()
{
  ...
  TRACE("hello %s", "taro");
  ...
}
-------------------------------------------------------

よくあるトレース処理だと思いますがこんな感じです。
他にも代替手段は考えつきますが、
可変長引数の関数のマクロが可能かが知りたいです。
どなたがご存知の方がいらっしゃいましたら、よろしくお願いします。

A 回答 (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 をプログラムでは使う。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ