在ioctrl、setopt、sendEvent等类似API中,通常第一个参数是类型(操作、事件类型),第二个参数是该类型对应的参数,不同的类型对应的参数类型及个数都是不同的,这就需要用到不定参数。下面介绍几种不定参数的传参方法。
- 结构体指针
将每个操作对应的参数封装为一个结构体,第二个参数类型定义为void *,传递结构体指针的方式传递不同的参数。 - va_list
VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数。
原理:函数参数是存储在栈中的,函数参数从右往左依次入栈,使用时依次出栈,按照每个事件对应参数的类型及顺序将出栈的参数转换出来。 - Android Parcel
Parcel是android实现的一个类,用于封装不同的数据类型,原理类似va_list,使用时需按照参数原排列顺序依次读取。