1

重複の可能性:
Cの引数リストで…はどういう意味ですか?

私はwin32プログラミングに関する本を読んでいて、次のような関数を見ました。

   int CDECL MessageBoxprintf(TCHAR *szCaption,TCHAR *szFrmat,...)  
   {
       TCHAR szBuffer[1024];
       va_list pArgList;
       va_start (pArgList,szFrmat);
      _vsnprintf(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),szFrmat,pArgList);
       va_end (pArgList);
       return MessageBox(NULL,szBuffer,szCaption,0);
    }

,...関数のパラメーターはどういう意味ですか?

検索して答えを見つけようとしましたが、何も役に立ちませんでした。

4

4 に答える 4

3

これらは可変個引数関数と呼ばれます。

...パラメータリストの最後にあるということは、関数が最後に必要な引数(存在する場合)の後に不確定な量の引数を取ることを意味します。

過剰な引数は、どのタイプでもかまいません。例えば:

void f(...) {}

f( 5, 0, 24 ); // works

f( "", 5, false ); // works

f( true, false, 4 ); // works

そして、それはとても気の利いたものです。そして、私たちはそれらを任意のタイプにしたいのが一般的ですが、同時にそれらを使っていくつかの一般的なことをしたいと思うかもしれません。そのために、テンプレートを使用します。

template <typename...Type> Type f( Type ... type ) {

    // do some generic thing        

    f(type...); // move to next argument
}
于 2012-11-01T18:51:53.183 に答える
3

これは、固定数の引数の代わりに、その関数に対して可変数の引数を持つことができることを意味します。完璧なユースケースは

たとえば、averageという関数があるとしましょう

double average ( int num, ... )
{
  va_list arguments;                     // A place to store the list of arguments
  double sum = 0;

  va_start ( arguments, num );           // Initializing arguments to store all values after num
  for ( int x = 0; x < num; x++ )        // Loop until all numbers are added
    sum += va_arg ( arguments, double ); // Adds the next value in argument list to sum.
  va_end ( arguments );                  // Cleans up the list

  return sum / num;                      // Returns the average
}

この関数は、任意の数の引数を使用してこのように呼び出すことができます

cout<< average ( 3, 12.2, 22.3, 4.5 ) <<endl; 

また、渡される引数は同じタイプである必要はありません。詳細については、このリンクを参照してください

于 2012-11-01T18:53:32.763 に答える
1

通常、関数に渡す引数が多すぎるとエラーになりますが、関数に...渡す引数を増やすことができます。引数の可変coutがあります。関数に渡された引数は、のマクロで取得できますstdarg.h。詳細については、これを参照してください。

于 2012-11-01T18:53:56.680 に答える
0

これは、funcが可変数の引数を受け入れることができることを意味します(後でva *マクロによって解析されます)

于 2012-11-01T18:46:35.233 に答える