函数声明中的省略号意味着它将接受许多参数,否则,在运行时未知的可变参数,通过使用标准头文件stdarg.h,分别该头文件“stdarg.h”中的函数可以确定构成传递给函数的参数的每个可变参数是什么。
考虑这个代码示例:
#define PANIC_BUF_LEN 256
void panic(const char *fmt, ...){
char buf[PANIC_BUF_LEN];
va_list argptr;
va_start(argptr, fmt);
vsprintf(buf, fmt, argptr);
va_end(argptr);
fprintf(stderr, buf);
exit(errcode);
}
典型的调用可以是示例之一:
panic("Error: %s failed! Due to unknown error, message is '%s'\n", "my_function", "Disk not ready");
将以这种方式在控制台上产生输出:
Error: my_function failed! Due to unknown error, message is 'Disk not ready'
注意函数va_start(...)、va_end(...) 的用法,更不用说vsprintf(...) 将负责填充“未知”参数中的空白提供 va_list 是初始化为指向到变量参数,这些参数在运行时是未知的。
编辑:只是强调一下,调用假定C字符串格式形式的字符串参数小于PANIC_BUF_LEN表示的最大大小上面的示例,挑剔的不谈,这是为了说明一个函数如何接受许多使用的标准C格式字符串,例如,可以在字符串格式中指定%d,并且期望 int 匹配参数。