标签:meta -- va_arg 调用函数 va_end 函数参数 %s 语言 固定
一. 实现原理
2.1 va_list
#define va_list char *
定义了一个指针arg_ptr, 用于指示可选的参数.
2.2 va_start(arg_ptr, argN)
#define va_start (ap, arg) (ap = (va_list)&arg+sizeof(arg))
使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.如有一va
函数的声明是void va_test(char a, char b, char c, ...), 则它的固定参数依次是a,b,c, 最后一个固定参数argN为c, 因此就是va_start
(arg_ptr, c).
2.3 va_arg(arg_ptr, type)
#define va_arg (ap, t) (*(t*)( ap+=sizeof(t) - sizeof(t)))
返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.
2.4 va_end(arg_ptr)
#define va_end (ap = (va_list)0)
清空参数列表, 并置参数指针arg_ptr无效.
三. 实例
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdarg.h> 4 5 void test(const char *format, ...) 6 { 7 va_list args; 8 const char *args1; 9 va_start(args, format); 10 args1 = va_arg(args,const char *); 11 va_end(args); 12 printf("format = %s args1 = %s", format, args1); 13 } 14 int main() 15 { 16 test( "test1", "test2"); 17 return 0; 18 }
标签:meta -- va_arg 调用函数 va_end 函数参数 %s 语言 固定
原文地址:https://www.cnblogs.com/mysky007/p/11204296.html