variadic function 的使用

最近在看<the c programming language> K&R  

  7.3章 Variable-length Argument Lists  变长参数列表, 笔记一下用法

1. 要用到的头文件  <stdarg.h>

  包含一些用来遍历(step through)变长参数列表的  宏(marco)定义

2. 类型 va_list : refer to each argument in turn    (va 是 variadic arguments的缩写)

  va_list ap;     /* 声明va_list 类型的指针 ap */

3. 宏va_start 

  用法: va_start(va_list , char *);

  初始化 va_list 类型的指针, 指向列表中第一个未命名的参数, 一定要先调用它

  va_start 要用到最后一个命名的参数,所以函数参数列表中至少要有一个命名参数

4.va_arg

  用法: va_arg(va_list , type name);         /* type name 可能是 int double 这些类型 */

  返回一个参数, 将指针指向下一个参数

5.va_end

  用法: va_end(va_list);

  对va_start 的善后工作

6.va_cpy

  用法:  va_copy(va_list src, va_list dest);  

 

示例代码: (摘自: man page)

对va_list  va_start va_arg  va_end 的简单顺序调用

/*  The  function  foo  takes  a string of format characters and prints out the argument associated
 *     with each format character based on the type.
*/
#include <stdio.h> #include <stdarg.h> void foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt);       while (*fmt) switch (*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s\n", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d\n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c\n", c); break; } va_end(ap); }

 



 

: Linux下可以用man 命令查看 stdarg, va_start, va_arg, va_end, va_copy

  man 3 stdarg

转载于:https://www.cnblogs.com/longwaytogo/p/6132323.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值