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

如果你给一个函数传递了太多的参数,通常是一个错误,但是...你可以传递更多的参数给它。它有一个可变的参数计数。传递给函数的参数可以由stdarg.h. 有关更多信息,请参阅

于 2012-11-01T18:53:56.680 回答
0

这意味着 func 可以接受可变数量的参数(稍后由 va* 宏解析)

于 2012-11-01T18:46:35.233 回答