2009-11-12 17 views
39

printfのような可変数のパラメータを受け取り、いくつかのことを行い、printfに変数リストを渡す関数を記述しようとしています。私はこれをどうやって行うのか分からない。なぜなら、それをスタックにプッシュしなければならないように思えるからだ。およそこのようなCプログラミング:前方可変引数リスト

何か

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

多分あなたとジョンは同じクラスですか? http://stackoverflow.com/questions/1714550/how-can-one-variable-args-function-call-another –

+2

[Cで可変長関数の呼び出しを転送する]の可能な複製(http://stackoverflow.com/question/150543/forward-a-variadic-function-in-c) – dmckee

答えて

49

printfに結果を渡さないでください。それらをvprintfに渡します。 vprintfは、特に引数がva_listであることを処理するために存在します。後者は明示的なパラメータ・リストに...を取る関数内で宣言したものとしてva_list引数を取る方法

#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); 

注意:Linuxのmanページから。したがって、あなたの関数は次のように宣言されます:

void forward_args(const char *format , ...){ 
    va_list arglist; 
    va_start(arglist, format); 
    vprintf(format, arglist); 
    va_end(arglist); 
} 
+1

まあ、彼は 'va_start()'と 'va_end()'も必要です。 –

+0

@Ken Bloom:そうです。一定。 – quark

+4

'va_start(arglist、format)' –

2

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

-1

私はこれを実装する方法に精通していません。 printfのような関数の実装を調べることをお勧めします。いくつかのオープンソースの実装が存在します。 glibc、uclibc(bsdとopensolarisがlibcのためにどのような呼び出し/使用をしているかわからない)

3

は、私はあなたがva_start()/​​/vsnprintf()/va_end()を探しているかなり確信して、これらを自分で実装する必要はありません。