va_list va_start va_arg va_end 这几个函数的使用

时间:2022-02-08 03:41:02

乍一看这几个函数好像很高级啊。
我来简单的记录一下。
首先说说它们的使用环境,就是当函数的参数个数是可变的时候才会用。
比如:
int function_test(int val, …);

这样的函数接口,它的参数个数是可变的,这就导致在实现这个函数内容时该如何获取调用者传给它的参数。

1.先定义一个指向可变参数的指针:
va_list ptr_va;

2.初始化一下这个指针,然后使用这个指针去获取参数;
va_start(ptr_va, val);
使用va_start()来初始化ptr_va,第个val的含义是function_test()的参数中的最后一个固定的参数,也就是…之前的参数,我后来推测了一下,它这么要求是不是想知道在栈中从哪里开始是可变参数啊,先定位一下。随着调完va_start(),ptr_va这个指针就已经指向了可变参数的第1个参数了,下面就该是获取这个参数了。

3.va_arg(ptr_va,int);
va_arg()的第2个参数表示将要获取的那个参数的类型,这样va_arg()就直接返回了想要的那个参数,把它的返回值赋给一个同类型的变量就行了。