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

老狗的博客

尽管每一步都很微小,但我确认我在进步

 
 
 

日志

 
 
关于我
sky

认真生活,努力工作 热爱技术,关注DB,存储,分布式,中间层,java,c++,php

可变参数列表  

2014-11-04 22:03:50|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
可变参列表的使用 ,使得格式化异常方便
int printf(const char *format, ...);
1. printf内部又是如何实现的呢?
va_list
typedef _G_va_list va_list;
:#define _G_va_list __gnuc_va_list
# define __gnuc_va_list      __ptr_t
#define __ptr_t void *
总得说来,va_list就是一个void *指针
va_start
void va_start(va_list ap, last);
va_start宏主要用来对于va_list ap进行初始化,以便于后续的va_arg和va_end使用
last指的是可变参数列表前的一个参数的形参的名字
va_arg
type va_arg(va_list ap, type);
va_arg用来返回ap中的当前参数,并修改ap(使得下一次访问可以获得下一个参数),如果type和下一个参数不兼容,或者没有下一个参数,将返回一个随机错误
va_end
void va_end(va_list ap);
每一个va_start,必须有一个va_end进行结束

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

void foo(char *fmt, ...) {

//首先定义了一个va_list ap
va_list ap;
int d;
char c, *s;
//其次对于ap进行初始化
va_start(ap, fmt);

//根据format的意义,逐个使用va_arg获取具体值
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进行关闭
va_end(ap);
}


2. 使用va_list的一些函数
  int vprintf(const char *format, va_list ap);
  int vfprintf(FILE *stream, const char *format, va_list ap);
  int vsprintf(char *str, const char *format, va_list ap);
  int vsnprintf(char *str, size_t size, const char *format, va_list ap);
这里va_list作为参数进行使用
  评论这张
 
阅读(118)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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