本站首页    管理页面    写新日志    退出                                          --==~欢迎光临FoxWolf的Blog~==--   



 日志搜索


«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告


我的分类

日志更新

最新评论

留言板

链接

 


Blog信息
blog名称:FoxWolf
日志总数:127
评论数量:246
留言数量:0
访问次数:859099
建立时间:2006年5月31日




[必须掌握]C语言中的可变长度参数列表-转
文章收藏,  网上资源,  电脑与网络

FoxWolf 发表于 2008/1/17 14:22:56

1.什么是可变长度参数 我们在C语言编程中有时会遇到一些参数个数可变的函数,即函数的入参个数和类型是不确定的,例如printf()函数,其函数原型为: int printf(char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("the number is %d ,string is:%s", i, s);     以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现的呢? 2.可变长度参数函数的一个例子 为了说明问题,通过编写一个自定义的可处理可变长度参数的函数minprintf来说明。        printf函数的定义格式为:        int printf(char *fmt, …)        这里,…的含义为参数的类型和个数是不确定的。…声明只能出现在参数列表的尾部。函数返回输出的字符个数。        我们自己定义的函数minprintf声明格式为:        void minprintf(char *fmt, …)        因为这里我们不需要返回输出的字符个数,所以定义返回类型为void。        带有可变长度参数的函数里,即没有参数的类型也没有参数的个数,那么编译器是怎么处理这样的函数的呢?        标准头文件stdarg.h定义了一系列的宏来处理这个可变长度的参数列表。这个头文件的实现会因编译器的不同而各异,但它们的接口却是相同的。        类型va_list: 定义为这样一个数据类型,循环使用且每次指向一个可变的参数;在我们举的例子minprintf函数里指变量ap(argument pointer);        函数va_start: 初始化ap,使ap指向第一个可变的参数;注意,这个函数必须在使用ap前被调用;minprintf必须至少有一个确定的参数,而且,最后一个确定的参数才是va_sart函数的一个入参;        函数va_arg:返回一个可变长度参数的值并使ap指向下一个可变长度参数,该函数使用一个类型名来确定要返回的类型和指针ap需要移动的字节单位;        函数va_end:做一些必要的清理工作,需要在程序结束前调用。other:int vprintf(const char *format, va_list arg) 函数vprintf与printf等价,只是用arg替换了变量参数列表,arg由va_start宏初始化,并且va_arg可能会调用它。


阅读全文(3424) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.109 second(s), page refreshed 144794526 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号