2009-09-28 3 views
38

printffprintfsprintfなどの関数とvprintfvfprintfvsprintfなどの関数の違いは、関数の引数をどう扱うかと関係していると私は理解しています。しかし、具体的にどのように?実際にはどちらかを使用する理由はありますか?私はちょうどprintfをCで見るのがより一般的なものとして使うべきですか、または代わりにvprintfを選ぶ正当な理由はありますか?printf関数ファミリとvprintf関数ファミリの違いは何ですか?また、どちらを使うべきですか?

答えて

59

printf()友人は通常の使用のためです。​​と友人は、あなた自身のprintf()のような機能を書いてみたいときに使います。あなたがエラーを印刷する機能を書きたいと言う:printf()ではなく1つのva_list引数よりも、多くの引数をとりますので、あなたは、あなたがprintf()argsを渡すことができないことに気づくでしょう

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    // what here? 
    va_end(args); 
    return result; 
} 

。​​機能は、しかし、ので、ここでは、代わりに引数の数が可変のva_list引数を取るか完成版です:あなたは同じように動作し `警告()`関数をしたい、もちろん

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    fputs("Error: ", stderr); 
    result = vfprintf(stderr, fmt, args); 
    va_end(args); 
    return result; 
} 
+1

あなたは_own_ 'vprintf()'スタイル関数を作成します: 'int verror(char * prefix、char * fmt、va_list args);' 'error()'を持っています。 "Error:"と "warn()"を "Warning:"と呼ぶが、それはすべての意味論だ。 –

+0

バリデーション機能を学ぶ時間!この答えは物事をクリアしました、ありがとう。 –

13

​​を直接使用することは決してありませんが、必要なときには非常に便利です。ラップprintf()。これらの場合、可変引数(...)を持つトップレベル関数を定義します。次に、それらをva_listに集めて処理し、最終的にに​​と電話をかけて、プリントアウトを取得します。

関連する問題