可变参数函数

关于这个东西,是C语言里面灵活的体现。

 

通过这种定义方式,我们可以直接访问参数的传入堆栈,利用这样一个原理,就可以自如地写入多个参数。

 

但是危险性也是很明显的,我们必须自己控制,何时停止在堆栈上访问,很容易越界访问。

 

这里有非常详细的用法

 

总结下来这几部分

 

头文件: #include<stdarg.h>

 

几个宏定义:

 

     typedef char *   va_list; 
     #define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) 
     #define va_start(ap,v)   ( ap = (va_list)&v + _INTSIZEOF(v) ) 
     #define va_arg(ap,t)     ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 
     #define va_end(ap)       ( ap = (va_list)0 ) 

 

一个小例子。

 

///实际调用的函数,start是用来得到函数参数地址的,没有实际意义 
int _fnAdd(int start,...) 

///关于va_list va_start和va_end请参看相关资料,或者直接看stdarg.h也可以。 
///比较好理解,只有一点,最上面那个 
///define是为了字节对齐用的。其实没有什么意义。 
///如果做成template,把va_arg中的int和返回的sum的类型参数化,就更通用了 

     va_list arg_ptr; 
     int sum=0,t=0; 
     va_start(arg_ptr,start);             ///得到参数表的首地址 
     while(t=va_arg(arg_ptr,int))

         sum+=t;  
     va_end(arg_ptr);                     ///把arg_ptr=NULL 
     return sum;         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值