注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

旷世的忧伤

不与夏虫语寒,不与曲人语道,因为生命缺乏言说的条件......

 
 
 

日志

 
 

C语言实现可变参函数  

2014-12-03 15:17:55|  分类: C语言 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
要处理可变参数,需要用C到标准库的va_list类型和va_start、va_arg、va_end宏,这些定义在stdarg.h头文件中。

下面是stdarg.h的一种实现:

/* stdarg.h standard header */
#ifndef _STDARG
#define _STDARG

/* type definitions */
typedef char *va_list;

/* macros */
#define va_arg(ap, T) \
            (* (T *)(((ap) += _Bnd(T, 3U)) - _Bnd(T, 3U)))

#define va_end(ap) (void)0

#define va_start(ap, A) \
            (void)((ap) = (char *)&(A) + _Bnd(A, 3U))

#define _Bnd(X, bnd) (sizeof (X) + (bnd) & ~(bnd))

#endif


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

va在这里是variable-argument(可变参数)的意思.

示例:

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

int add(int cnt, ...)
{
    int i, tmp, sum = 0;
    va_list ap;

    va_start(ap, cnt); //获取变参列表起始地址,下次调用va_arg时会返回第一个变参的首地址

//即ap指针指向cnt的下一个参数的地址

    for (i = 0; i < cnt; i++)
    {
        tmp = va_arg(ap, int);

//va_arg先取出当前ap所指向的地址的值,然后ap再指向下一个参数的地址

        printf("--%d: %d\n", i+1, tmp);
        sum += tmp;
    }
    va_end(ap);

    return sum;
}

int main(void)
{
    printf("***************** split ****************\n");
    printf("sum: %d\n", add(3, 10, 10, 10));

    return 0;
}

  评论这张
 
阅读(3)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017