OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

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

  • 困ってます
  • 質問No.100283
  • 閲覧数970
  • ありがとう数4
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 36% (4/11)

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

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

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

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

よくあるトレース処理だと思いますがこんな感じです。
他にも代替手段は考えつきますが、
可変長引数の関数のマクロが可能かが知りたいです。
どなたがご存知の方がいらっしゃいましたら、よろしくお願いします。
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全1件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

> 可変長引数をとる関数をマクロで置き換えたい いわゆる「一般的なC言語」では、できません。ただ、つい最近 C言語の 規格が新しくなりました(C99)。 その規格では、可変長引数を取るマクロが使えます。こんな感じ。 #define TRACE(fmt, ...) trace(__FILE__,__LINE__,fmt,__VA_ARGS__) void trace(char ...続きを読む
> 可変長引数をとる関数をマクロで置き換えたい

いわゆる「一般的な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で解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ