小伙伴们听到可变参数,可能会觉得里面包含各种类型和不定数量的变量,实现起来是不是不容易。事实上,可变参数的实现反而是很简单的。
- ANSI C标准之前的1981年就存在一套 varargs.h 头文件实现可变参数,标准采纳了stdarg.h, varargs.h仅仅接受一个参数,即可变参数指针位置,但stdarg.h预期在可变参数前额外有一个固定参数。
- 可变参数的解析由libc完成,对于不同格式的数据,例如%d代表int, %f代表浮点数,%c代表字符,libc根据格式取出对应大小的参数,并逐次移动参数指针,直到解析完成或者发现错误。
不同的可变参数
- C/ObjC/C++/Java 用 ... 代表可变参数。
- Kotlin 用 vararg 指代可变参数,还支持数组当可变参数传入(数组前面加上*)。
- Python 对可变参数很简易,有两种情况:
- 参数前面加星号*代表可变参数,对于外部传递的多个参数,函数将统一包装成一个元组。
- 参数前面加两个星号**代表关键字参数,对于外部传递的多个参数,统一包装成字典的属性。
- C# params 修饰代表可变参数。