二、va_start、va_arg和va_end宏定义 接着我们再来看看va_start、va_arg和va_end等宏的具体定义。 #define_INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )//此句宏的作用是将类型n的大小向上取成4的倍数,如n为char型的话结果即为4#ifdef __cplusplus#define_ADDRES...
va_start(p_args, __format); // __format一定是...前的第一个参数 const char * func = va_arg(p_args, const char *); // 得到__func__值 int line = va_arg(p_args, int); // 得到__LINE__值 int data = va_arg(p_args, int); // 得到data值 va_end(p_args); ...
这样编译器不会为va_end产生代码,例如gcc在linux的x86平台就是这样定义的. 在这里大家要注意一个问题:由于参数的地址用于va_start宏,所以参数不能声明为寄存器变量或作为函数或数组类型. 关于va_start, va_arg, va_end的描述就是这些了,我们要注意的 是不同的操作系统和硬件平台的定义...
va_start(arg_ptr, argN) 2.va_arg #include <stdarg.h>//必须包含头文件 /* * 返回参数列表中指针arg_ptr所指的参数, 返回类型为type. * 并使指针arg_ptr指向参数列表中下一个参数. * 返回的是可选参数, 不包括固定参数. */ va_arg(arg_ptr, type) 3.va_end #include <stdarg.h>//必须包含头...
va_arg(arg_ptr, type)根据当前指向的可变参数的类型type得到当前指向的可变参数的值,并且arg_ptr指针上移一个_INTSIZE(int),即指向下一个可变参数的地址。 va_end(arg_ptr) 清空arg_ptr指针,即arg_ptr=0 以上,读取可变参数的过程其实就是遍历堆栈中参数列表的过程,从低地址到高地址一个一个把参数内容读出...
2)然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数. 3)然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个参数是你要返回的参数的类型,这里是int型. 4)最后用va_end宏结束可变参数的获取.然后你就可以在函数里使用第二个参数了.如果函数有...
va_end结束可变参数函数的遍历 void va_end(va_list ap); 概要:调用函数必须声明一个va_list类型的变量,以供宏va_start(),va_arg()和va_end()使用。va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行。在调用参数表之前,定义一个 va_list 类型的变量,(假设va_list 类...
2、用va_start获取函数可变参数列表 3、用va_arg循环处理可变参数列表中的各个可变参数 4、用va_end结束对可变参数列表的处理 在ANSI C中,这些宏的定义位于stdarg.h中: *typedef charva_list; va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数): ...
va_end(arg_ptr);//复位指针 returnsum; } 函数的调用方法为Add(1,2,3,0);这样,必须以0结尾,因为变参函数结束的判断条件就是读到0停止。 解释: 所使用到的宏: voidva_start(va_listarg_ptr,prev_param); typeva_arg(va_listarg_ptr,type); voidva_end(va_listarg_ptr); typedefchar*...
va_start va_arg va_end 的使用和原理 func( Type para1, Type para2, Type para3, ... ) { /*** Step 1 ***/ va_list ap; va_start( ap, para3 ); //一定要“...”之...