va-start-va-arg-va-end-的使用和原理
摘要:func(Typepara1,Typepara2,Typepara3,...){/******Step1******/va_listap;va_start(ap,para3);//一定要“...”之前的那个参数**ap指向para后的第一个可变参数。/******Step2******///此时ap指向第一个可变参数//调用va_arg取得里面的值Typexx=va_arg(ap,Type);//Type一定要相同,如://char*p=va_arg(ap,char*);//inti=va_arg(ap,int);//如果有多个参数继续调用va_arg/******Step3******/va_end(ap);//Forrobust!}◎研究:typedefchar*va_list;//va_list等价于char*即字符指针。#defineva_start_crt_va_start//注意下面的替代。#defineva_arg_crt_va_arg#defineva_end_crt_va_end#define_crt_va_start(ap,v)(ap=(va_list)_ADDRESSOF(v)+_INTSIZEOF(v))#define_crt_va_arg(ap,t)(*(t*)((ap+=_INTSIZEOF(t))-_INTSIZEOF(t)))#define_crt_va_end(ap)(ap=(va_list)0)va_listargptr;C语言的函数是从右向左压入堆栈的,调用va_start后,按定义的宏运算,_ADDRESSOF得
温馨提示:当前文档最多只能预览
5 页,若文档总页数超出了
5 页,请下载原文档以浏览全部内容。
本文档由 匿名用户 于 2022-10-30 23:19:22上传分享