我正在浏览MinGW附带的stdio.h头文件,并注意到printf
函数声明如下:
int printf (const char *__format, ...)
{
//body omitted
}
我之前从未见过功能参数列表中的省略号,所以我试了一下。它编译并运行没有错误。那么,“......”的目的是什么?
答案 0 :(得分:5)
答案 1 :(得分:2)
它通知编译器该函数具有可变参数列表。这是一项仅适用于__cdecl
调用约定的功能。它允许调用者在最后一个固定参数之后指定它想要的任何参数值,因为调用者将在函数退出时清理参数。变量参数通常用于printf样式函数,其中可变参数值的解释取决于固定参数值的值(例如将单个可变参数与__format
参数中的每个格式说明符匹配)。
答案 2 :(得分:1)
它用于允许可变数量的参数或未指定类型的参数,如printf()
所做的那样。允许可变数量的argumnets的函数称为Variadic Function
使用va_start
,va_list
,va_end
和va_arg
Variable number of Arguments (...)
#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;
}
希望这有帮助。