C语言函数可变长参数应用

1.1 什么是可变长参数

可变长参数:顾名思义,就是函数的参数长度(数量)是可变的。比如 C 语言的 printf 系列的(格式化输入输出等)函数,都是参数可变的。下面是 printf 函数的声明:

int printf ( const char * format, ... );

可变参数函数声明方式都是类似的。

1.2 如何实现

C语言可变参数通过三个宏(va_start、va_end、va_arg)和一个类型(va_list)实现的,

void va_start ( va_list ap, paramN );
参数:
ap: 可变参数列表地址 
paramN: 确定的参数
功能:初始化可变参数列表(把函数在 paramN 之后的参数地址放到 ap 中)。

void va_end ( va_list ap );
功能:关闭初始化列表(将 ap 置空)。

type va_arg ( va_list ap, type );
功能:返回下一个参数的值。

va_list :存储参数的类型信息。

好了,综合上面3个宏和一个类型可以猜出如何实现C语言可变长参数函数:用 va_start 获取参数列表(的地址)存储到 ap 中,用 va_arg 逐个获取值,最后用 va_arg 将 ap 置空。

1.3 举例

/*
 * c语言可变长参数案例
 * va_arg_demo.c
 * Created on: Oct 10, 2016
 * Author: zhangming
 */
#include <stdio.h>
#include <stdarg.h>

#define END -1

/**
 * 遍历打印可变参数
 */
void va_list_args(char* first_str,...){
    //(1)定义参数列表
    va_list args;
    //(2)初始化参数列表
    va_start(args,first_str);
    while(1){
        char *arg = va_arg(args,char*);
        if(strcmp(arg,"end") == 0){
            break;
        }
        printf("%s ",arg);
    }
    va_end(args);
}

main(){
    va_list_args("begin","aaa","bbb","ccc","end");
}

运行结果:  aaa bbb ccc 

posted @ 2016-10-11 14:31  水火379  阅读(132)  评论(0)    收藏  举报