C语言中函数是支持可变参数的,当然也存在着一些限制,可变参数是利用宏来实现,在头文件stdarg.h里面定义。头文件声明了一个类型va_list和三个宏———va_start,va_arg和va_end。比较常用的是用来构造专门输出函数,这里用一个综合的例子来介绍:
#include
#include
/**
*** Self stderr
***/
static void dbg_stderr(char *fmt, ...)
{
va_list args;
va_start(args, fmt);
fprintf(stderr, "ERROR: ");
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
}
static float multi(int n_values, ...)
{
va_list args;
int count;
float sum = 0;
va_start(args, n_values);
for (count = 0; count < n_values; count +=1) {
sum += va_arg(args, int);
}
va_end(args);
return sum / n_values;
}
int main(void)
{
int ch =5;
int Yu_Ebao = 1, Bank_Card = 1;
char str[10] = "Yuan";
float average;
average = multi(2, Yu_Ebao, Bank_Card);
dbg_stderr("Your money is less than %f %s (%>_<%)!!!", average, str);
}
结果为:
ERROR: Your money is less than 1.000000 Yuan (%>_<%)!!!
static void dbg_stderr(char *fmt, ...)
我把使用可变参数形容为四段式,何为四段式,总决式,破剑式,破刀式,破掌式。。(⊙o⊙)…跑题了,如图:
static float multi(int n_values, ...)
{
va_list args; /*总决式*/
va_start(args, n_values); /*起始式*/
{
va_arg(args, int); /*过程式*/
}
va_end(args); /*终止式*/
}
以上面以上multi的函数为例(这边引用
再来说说上述代码的意思,static void dbg_stderr(char *fmt, ...)函数的是构造专门的错误输出函数,第一个fprintf输出"Error:"前缀,接着vfprintf用于按照fmt字符串转换并格式化数据,输出到stderr流中,最终再调用fprintf打印换行符。而static float multi(int n_values, ...)函数是用来计算可变参数的平均值,当然前提要求可变参数的类型都得是int。
到这里可变参数的限制也显示出来了:
1.在用va_start时候,要求函数输入参数至少得有一个命名参数,不然无法使用va_start;
2.在使用这些宏时候,无法判断参数的类型和参数的数量,需要程序人为的指定。