C语言之可变参数列表

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的函数为例(这边引用例子),首先函数定义里面包含有省略号...,提示可能传递数量和类型未确定的参数,接着函数内部的"总决式",va_list args定义一个args变量,可以理解为用于访问可变参数的列表,接着va_start(args,n_values)用于初始化(第一个参数是va_list变量的名字,第二个参数是省略号前最后一个有名字参数),var_arg(args,int)(用于访问参数列表下一个参数类型,返回这个参数的值,第一个参数是va_list变量名字,第二个参数是类型),最后,全部访问完,调用va_end(args)结束。基本按照这种格式就可以访问可变参数了。

再来说说上述代码的意思,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.在使用这些宏时候,无法判断参数的类型和参数的数量,需要程序人为的指定。

 

你可能感兴趣的:(C/C++语言)