C语言变参函数的编写.doc

C语言变参函数的编写.doc

ID:51687188

大小:34.50 KB

页数:7页

时间:2020-03-15

C语言变参函数的编写.doc_第1页
C语言变参函数的编写.doc_第2页
C语言变参函数的编写.doc_第3页
C语言变参函数的编写.doc_第4页
C语言变参函数的编写.doc_第5页
资源描述:

《C语言变参函数的编写.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C语言变参函数的编写1.引言一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数。但在某些情况下我们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数。典型的可变参数函数的例子有printf()、scanf()等。例如:printf(“hello,world!”);其参数个数为1个。printf(“a=%d,b=%s,c=%c”,a,b,c);其参数个数为4个。如何编写可变参数函数呢?我们首先来看看printf函数原型是如何定义的。在linux下,输入man3printf,可以看到p

2、rinf函数原型如下:SYNOPSIS#includeintprintf(constchar*format,...);后面的三个点...表示printf参数个数是不定的.如何实现可变参数函数?2.编写可变函数准备为了编写可变参数函数,我们通常需要用到头文件下定义的以下函数:[cpp]viewplaincopyprint?1.voidva_start(va_listap,last);2.typeva_arg(va_listap,type);3.voidva_end(va_listap);4.voidva

3、_copy(va_listdest,va_listsrc);5.其中:6.va_list是用于存放参数列表的数据结构。1.va_start函数根据初始化last来初始化参数列表。2.va_arg函数用于从参数列表中取出一个参数,参数类型由type指定。3.va_copy函数用于复制参数列表。4.va_end函数执行清理参数列表的工作。voidva_start(va_listap,last);typeva_arg(va_listap,type);voidva_end(va_listap);voidva_copy(va_listdest,va

4、_listsrc);其中:va_list是用于存放参数列表的数据结构。va_start函数根据初始化last来初始化参数列表。va_arg函数用于从参数列表中取出一个参数,参数类型由type指定。va_copy函数用于复制参数列表。va_end函数执行清理参数列表的工作。[cpp]viewplaincopyprint?1.上述函数通常用宏来实现,例如标准ANSI形式下,这些宏的定义是:2.typedefchar*va_list;//字符串指针3.4.#define_INTSIZEOF(n)((sizeof(n)+sizeof(int)-1

5、)&~(sizeof(int)-1))5.6.#defineva_start(ap,v)(ap=(va_list)&v+_INTSIZEOF(v))7.8.#defineva_arg(ap,t)(*(t*)((ap+=_INTSIZEOF(t))-_INTSIZEOF(t)))9.10.#defineva_end(ap)(ap=(va_list)0)11.使用宏_INTSIZEOF是为了按照整数字节对齐指针,因为c调用协议下面,参数入栈都是整数字节(指针或者值)。上述函数通常用宏来实现,例如标准ANSI形式下,这些宏的定义是:typede

6、fchar*va_list;//字符串指针#define_INTSIZEOF(n)((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))#defineva_start(ap,v)(ap=(va_list)&v+_INTSIZEOF(v))#defineva_arg(ap,t)(*(t*)((ap+=_INTSIZEOF(t))-_INTSIZEOF(t)))#defineva_end(ap)(ap=(va_list)0)使用宏_INTSIZEOF是为了按照整数字节对齐指针,因为c调用协议下面,参数入栈都是

7、整数字节(指针或者值)。函数官方说明,如果你看到英文就烦,可以自行忽略以下说明。va_start()Theva_start()macroinitializesapforsubsequentusebyva_arg()andva_end(),andmustbecalledfirst.Theargumentlastisthenameofthelastargumentbeforethevariableargumentlist,thatis,thelastargumentofwhichthecallingfunctionknowsthetype.B

8、ecausetheaddressofthisargumentmaybeusedintheva_start()macro,itshouldnotbedeclaredasaregistervari

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。