c可变参数

要使用可变参数,需要包含头文件stdarg.h,该头文件声明了一个类型va_list和三个宏va_start、va_arg和va_end,例子如下:
void foo(char *fmt, ...) {
        va_list ap;
        int d;
        char c, *p, *s;

        va_start(ap, fmt);
        while (*fmt)
                switch(*fmt++) {
                case 's':                       /* string */
                        s = va_arg(ap, char *);
                        printf("string %s\n", s);
                        break;
                case 'd':                       /* int */
                        d = va_arg(ap, int);
                        printf("int %d\n", d);
                        break;
                case 'c':                       /* char */
                        /* need a cast here since va_arg only
                           takes fully promoted types */
                        c = (char) va_arg(ap, int);
                        printf("char %c\n", c);
                        break;
                }
        va_end(ap);
}
1.在定义函数时,最后一个参数为省略号'...',表示传递的参数个数和类型不确定。

2.使用va_list声明了一个变量ap,用于访问参数列表中未确定部分,通过调用va_start宏来初始化,让ap变量指向可变参数的第一个参数,该宏有两个参数,第一个参数为va_list类型变量,第二个参数为可变参数的前一个参数,使用可变参数的函数至少包含一个确定参数,因为它必须找到这组可变参数的起始地址,通过什么方式去找呢,只有通过最后一个确定参数的地址来找,下一个参数的地址就是可变参数的地址。

3.va_arg用于返回一个可变参数并将变量ap指向下一个可变参数,va_arg宏也有两个参数,第一个参数为va_list类型变量,第二个参数为参数列表类型。

4.当访问完可变参数后,需要调用va_end宏,完成一些必要的扫尾工作。


你可能感兴趣的:(c可变参数)