51

printfのような可変数のパラメーターを受け取り、いくつかの処理を行ってから、変数リストをprintfに渡す関数を作成しようとしています。それらをスタックにプッシュする必要があるように思われるため、これを行う方法がわかりません。

ほぼこのようなもの

http://pastie.org/694844

#include <stdio.h>
#include <stdarg.h>

void forward_args( const char *format , ... ){
  va_list arglist;
  printf( format, arglist );
}


int main (int argc, char const *argv[]){
  forward_args( "%s %s\n" , "hello" , "world" );  return 0;
}

何か案は?

4

3 に答える 3

60

結果を に渡さないでくださいprintf。に渡しますvprintfvprintf特にva_list引数の受け渡しを処理するために存在します。Linux のマニュアルページから:

#include <stdio.h>

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

#include <stdarg.h>

int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

後者は、パラメータ リストva_listを取得する関数内で宣言する引数など、明示的に引数を取得する方法に注意してください。...したがって、関数は次のように宣言されます。

void forward_args( const char *format , ... ){
   va_list arglist;
   va_start( arglist, format );
   vprintf( format, arglist );
   va_end( arglist );
}
于 2009-11-12T04:16:29.500 に答える
5

va_start()/ vprintf()/ vsnprintf()/を探していると確信していva_end()ます。これらを自分で実装する必要はありません。

于 2009-11-12T04:14:07.817 に答える
2

arglist値を、それを消費するように設計された関数に渡します。その他の手がかりについては、stdargおよびvprintfのドキュメントを参照してください。

于 2009-11-12T04:04:44.000 に答える