对于可变参数函数来获得它们的变量参数,我们可以使用以下宏获得:



#包括



无效va_start(va_list AP,最后);



型va_arg(va_list AP型);



无效va_end(va_list美联社);



无效va_copy(va_list dest,va_list SRC);



如果不理解实现原理,如何使用这些宏总是很难记住,因此有必要澄清变参数函数的基本原理。



无效variable_argument_func(int int arg1,arg2,…)



{



我们应该如何获得变量参数。



首先我们要明白他们靠近arg0,arg1存储在函数的调用栈。



/ /从低到高的arg1-arg2变量参数1参数2 -变参数n。



我们假设编译器是对这些变量的连续存储,没有对齐限制。



如果要获得每个变量,我们需要知道它们的第一个地址,每种类型的变量。



int VA1;



int VA2;



int VA3;



void * va_p = 2 + 1; / /最后的固定变量,得到的第一个地址的变量参数



VA1 =(va_p *(int *)); / /顺序为每个变量



va_p = sizeof(int);



VA2 = *((int *)va_p);



va_p = sizeof(int);



VA3 = *((int *)va_p);



}



我们可能会注意到,上述所有使用int变量,因为它符合先前的假设:所有参数的连续存储,如果参数中包含其他非4字节对齐的变量,类似于上面的方法会犯错,这些特性取决于编译器,所以我们应该用stdarg H宏。,我们的目的是了解实施的原则,只是。