函数参数`...`这是什么意思?

时间:2012-11-01 18:44:23

标签: c

  

可能重复:
  What does … mean in an argument list in 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 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

这意味着您可以拥有该函数的多个参数,而不是固定数量的参数。 一个完美的用例是

例如,假设我们有一个名为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; 

传递的参数也不必是同一类型。 有关详细信息,请查看此link

答案 2 :(得分:1)

通常,如果向函数传递过多参数,则会出错,但使用...可以向其传递更多参数。它有一个变量cout的参数。传递给函数的参数可以由stdarg.h中的宏检索。有关详细信息,请参阅this

答案 3 :(得分:0)

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