2011-11-14 16 views
2

私はMinGWのが付属していますstdio.hのヘッダファイルを経由してprintf機能は次のように宣言されていることに気づいた。cの関数宣言で "..."とはどういう意味ですか?

int printf (const char *__format, ...) 
{ 
    //body omitted 
} 

私はので、私はそれを試してみた前に、関数の引数リストに省略記号見たことがありません。コンパイルしてエラーなく実行します。それでは、「...」の目的は何ですか?関数は、パラメータの可変数を取る可変引数関数であることを意味し

答えて

5

http://en.wikipedia.org/wiki/Variadic_function

printf()自体はおそらく可変引数関数の最良の例です。

+0

ワウ。私はcがこれらを持っていたことを知らなかった、今それを試してみてください。ありがとう。 – Abbas

+1

可変関数関数を実装しようとしている場合は、パラメータにアクセスするために 'stdarg.h'を使う必要があります。したがって、通常の関数ほど単純ではありません。 – Mysticial

+0

あなたは正しいですが、他の言語に比べてまったくまっすぐではありません。 Wikipediaのサンプルでもsum関数を書くのに2,3分かかりました。とにかく、そこにあることを知ってよかった。何か良いことは何もありません:)。 – Abbas

2

この関数には、パラメータの可変リストがあることをコンパイラに通知します。これは、__cdecl呼び出し規約でのみ機能する機能です。呼び出し元は、関数が終了したときに呼び出し元がパラメータをクリーンアップするので、最後の固定パラメータの後に必要なパラメータ値を指定することができます。 Variadicパラメータは、可変パラメータ値の解釈が固定パラメータ値の値(例えば、__formatパラメータで個々の可変パラメータを各フォーマット指定子に一致させるなど)に依存するprintf形式の関数でよく使用されます。

1

これは、可変数の引数またはパラメータを指定することができます。具体的には、printf()となります。 argumnetsの可変数を可能にする機能は、Variadic Function

可変個引数変数はva_startva_listva_end

Sample Implementation:

#include <stdarg.h> 

double average(int count, ...) 
{ 
    va_list ap; 
    int j; 
    double tot = 0; 
    va_start(ap, count); //Requires the last fixed parameter (to get the address) 
    for(j=0; j<count; j++) 
     tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument. 
    va_end(ap); 
    return tot/count; 
} 

Variable number of Arguments (...)va_argホープこのことができますでアクセスされると呼ばれます。

+0

'va_list ap;'と 'va_end(ap);'の行について説明してください。前もって感謝します。 – wannik

+1

va_listとva_endはstdarg.hライブラリで定義されているマクロで、va_listは引数ポインタ(ap)変数に使用されます。 va_end(ap)は引数ポインタの使用を終了します。 va_end呼び出しの後、同じapを持つva_arg呼び出しがうまく動作しないことがあります。 – AlphaMale

関連する問題