奇思妙想 · 2024年 9月 22日 0

可变参数其实不复杂

37 次浏览

小伙伴们听到可变参数,可能会觉得里面包含各种类型和不定数量的变量,实现起来是不是不容易。事实上,可变参数的实现反而是很简单的。

  • 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 修饰代表可变参数。