C可变参数的函数


有的时候函数的参数个数在调用的时候才确定,这时函数的参数为可变参数

使用可变参数时用到的几个库函数:

void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );


va_list:用来保存宏va_start、va_arg和va_end所需信息的一种类型。为了访问变长参数列表中的参数,必须声明
             va_list类型的一个对象       定义: typedef char *  va_list;
va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和
               va_end使用;
va_arg: 展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改
              用va_list声明的对象,从而使该对象指向参数列表中的下一个参数;

va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回。


这三个库函数和变量va_list类型定义在c库:《stdarg.h>中定义


使用的基本格式为:

//包含头文件<stdarg.h>

#include <stdarg.h>

//可变参数函数定义时的可变参数用“...”表示
int func(int cnt, ...)
{
    //定义一个va_list变量,用来取函数的可变参数
    va_list var_arg;

    /*函数的其他变量定义*/


    //vabegin,取可变参数开始,第一个参数为自己定义的valist变量,第二个参数为函数可变参数的前一个显示定义的参数
    //也就是告诉程序从函数参数的什么位置开始取可变参数
    va_start(var_arg,cnt);

    for(;va_cnt < cnt;va_cnt++)
    {
        //逐个取函数的可变参数,传入的参数类型为char *
        type = va_arg(var_arg, type);

    }

    //结束可变参数获取
    va_end(var_arg);


/*函数的处理*/

    return 0;

}


示例程序:

#include <stdio.h>
#include <stdarg.h>

//可变参数函数定义时的可变参数用“...”表示
int func(int cnt, ...)
{
    //定义一个valist变量,用来取函数的可变参数
    va_list var_arg;

    int va_cnt=0;

    char *pChar;

    //vabegin,取可变参数开始,第一个参数为自己定义的valist变量,第二个参数为函数可变参数的前一个显示定义的参数
    //也就是告诉程序从函数参数的什么位置开始取可变参数
    va_start(var_arg,cnt);

    for(;va_cnt < cnt;va_cnt++)
    {
        //逐个取函数的可变参数,传入的参数类型为char *
        pChar = va_arg(var_arg, char *);
        puts(pChar);
    }

    //结束可变参数获取
    va_end(var_arg);

    return 0;

}




int main(int agc, char **argv)
{
    char *pChar = "hello variable argument 1";

    puts("------call func with 3 arguments------");
    func(2,pChar,"hello variable argument 2");

    puts("------call func with 4 arguments------");
    func(2,pChar,"hello variable argument 2","hello variable argument 3");


    return 0;
}


运行结果:

------call func with 3 arguments------
hello variable argument 1
hello variable argument 2
------call func with 4 arguments------
hello variable argument 1
hello variable argument 2
hello variable argument 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值