设为首页 加入收藏

TOP

C可变参数函数实现
2012-11-28 12:44:37 来源: 作者: 【 】 浏览:297
Tags:可变 参数函数 实现

    一直以来习惯了使用printf函数,但是对于可变参数没有深入研究过,觉得可变参数是一个神奇的技术.想研究研究看可变参数的使用和原理.目前C提供的可变参数的申明为

    void function(const char *format, ...);

    这样就可以在function中使用可变参数C提供了几个宏用于使用可变参数

    va_list

    va_start

    va_arg

    va_end

    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在这里是variable-argument(可变参数)的意思.

    这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.

    #include <cstdarg>

    #include <cstdio>

    #include <iostream>

    using namespace std;

    void Output(char *szFormat, ...)

    {

    va_list argptr;

    char szBuf[1024];

    va_start(argptr, szFormat);

    vsprintf_s(szBuf,szFormat, argptr);

    cout<<szBuf<<endl;

    va_end(argptr);

    }

    //output the args

    int ArgsCount(char *szFormat, ...)

    {

    va_list argptr;

    int argNomber = 0;

    char *szBuf;

    va_start(argptr,szFormat);

    while (1)

    {

    szBuf = va_arg(argptr,char*);

    if(strcmp(szBuf,“0”) == 0)

    break;

    cout<<“the parameter #”<<argNomber<<“ is ”<<szBuf<<endl;

    argNomber++;

    }

    va_end(argptr);

    return argNomber;

    }

    int main()

    {

    char czA[] = “wql”;

    char czB[] = “hello”;

    Output(“Who are you i am %s, %s”,czA,czB);

    ArgsCount(“Hello”, “Who”,“are”,“you”,“i am”,“wql”, “0”);

    return 0;

    }

    1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变 量是指向参数的指针.

    2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第 一个可变参数的前一个参数,是一个固定的参数.

    3)然后用va_arg返回可变的参数,并赋值给整数j.va_arg的第二个参数是你要返回的参数的类型,这里是int型.

    4)最后用va_end宏结束可变参数的获取,然后你就可以在函数里使用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获 取各个参数.

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇简单分析C语言的二维数组模拟 下一篇c语言static与extern的用法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: