web-dev-qa-db-ja.com

引数リストを別の可変引数関数に送信する可変個引数関数を作成することは可能ですか?

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

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

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

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

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

25
gct

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を使用する別のバージョンを作成する必要があります。このタイプの連鎖呼び出しを有効にする場合は、これを丁寧に行う必要があります。

13
Chris Becke

これが、 vprintf 関数ファミリーがある理由です。

6

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

4
T.J. Crowder

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

3