va_start 分析,START分析

Fmt给自己举个例子:四个重要的宏:va_ listva_startva_ argva_ end/123 。-1/指定列表开头的参数va_arg取出列表中的参数,如前所述va_ listap;然后va_start(AP,# defineva_start(AP 。
1、C语言中如何实现可变参函数1,标准C库中的三个宏只是用来确定变量参数表中每个参数的内存地址,编译器并不知道参数的实际个数 。2、在代码的实际应用中,程序员必须考虑确定参数个数的方法 , 比如(1)在固定参数中设置标志printf函数就是使用这种方法 。⑵预先设置一个特殊的结束标记,也就是多输入一个变量参数 。调用时,将最后一个变量参数的值设置为这个特殊值,根据函数体中的这个值判断是否到达参数的末尾 。
3.实现可变参数的关键是找到一种方法来获得每个参数的地址 。地址的获取方式由以下因素决定:①函数栈的增长方向;②参数进入堆栈的顺序;③CPU的对齐;④存储地址的表达;结合源代码我们可以看到va_list的实现是由④决定的 , 而_INTSIZEOF(n)的引入是由③决定的 。他和①、②一起决定了va_ start的实施 。最后,va_end的存在是良好编程风格的体现,不再使用的指针设置为NULL 。
2、C语言头文件ansidecl.h中定义的宏VA这是用来处理可变参数的 。实际上C标准只定义了va_start、va_ end、/_ copy、 。va_ start用于初始化变量参数表va_copy复制参数表而不直接使用源参数表 。当然,这个复制的参数表中的参数信息和源列表是一样的 。var_arg提取参数列表中的下一个参数var_end进行端到端的参数处理(如果函数调用va_ start , 应该在函数返回之前调用) 。
...){va_ listap;//存储变量参数的信息列表var _start(AP,num);//初始化参数列表 , 你要告诉var_ start,也就是最后一个命名的参数(其实就是前面那个...),而且这个是num,因为va_- 。
3、#define va_ start(ap,parmN【va_start 分析,START分析】 macro表示一个参数长度可变的函数,相当于一个声明 。定义一个函数,并且:voidva_start(intap,intv){ AP(va_ list)

    推荐阅读