25

重複の可能性:
Cプログラミング:変数引数リストを転送します。

私がやりたいのは、printfのような方法で(変更できない)ロギングライブラリにデータを送信することです。

だから私はこのような関数が欲しいです:

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   sprintf(buff, fmt, <varargs>);
   log(DEBUG, buff);
}

何らかの方法でvarargsを別のvararg関数に渡すことはできますか?

4

5 に答える 5

32

...その下にあるものをパラメーターとして別の関数に表現する方法がないため、可変引数リストを転送することはできません。

ただし、パラメーターva_listからを作成し、それを適切にフォーマットする関数に送信できます。これが目的です。例:...vsprintf

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   va_list args;
   va_start(args, fmt);
   vsprintf(buff, fmt, args);
   va_end(args);
   log(DEBUG, buff);
}
于 2010-01-13T22:03:44.457 に答える
13

va_list を引数として取る別の関数に送信できます。手作りの asm に頼るか、ある種の恐ろしい推測ゲームを実行してパラメーターの「数」を把握する以外に方法はありません。

これはうまくいきます:

void log_DEBUG(const char* fmt, ...)
{
  va_list va;
  va_start(va,fmt);
  char buff[blah];
  vsprintf(buff,fmt,va);
  log(DEBUG,buff);
  va_end(va);
}

基本的に、... を取る関数を書くときはいつでも、va_list を取る別のバージョンを書くべきです - このタイプの連鎖呼び出しを有効にしたい場合は、それが礼儀正しいことです。

于 2010-01-13T22:01:22.330 に答える
6

vprintfこれが、関数のファミリーを持っている理由です。

于 2010-01-13T22:00:33.497 に答える
4

特定の要件については、を使用できますvsprintf。私のC/C ++は、他の関数が(醜いスタック操作に入ることなく)設計されていないときにそれを行う簡単な方法があるかどうかを思い出すにはあまりにも錆びていますが、私はそうは思わない傾向があります。

于 2010-01-13T22:00:46.057 に答える
3

標準のC++にはありません。

于 2010-01-13T21:58:44.933 に答える