我正在读一本关于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);
}
,...
在函数的参数中意味着什么?我试图通过搜索找到答案但我没有任何用处。
答案 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 *宏解析)