C语言可变参数
本文最后更新于:5 个月前
学习过程中查看了printf()
源码,遇到了这样的函数定义,
1 |
|
参数中的三个点号,就是C语言中可变参数的标识。这样的函数称为可变参数函数。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(optional argument)。
这种函数必须至少有一个强制参数。可选参数的类型可以变化。可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定。
C 语言中最常用的可变参数函数例子是 printf()
和 scanf()
。这两个函数都有一个强制参数,即格式化字符串。格式化字符串中的转换修饰符决定了可选参数的数量和类型。
可变参数函数要获取可选参数时,必须通过一个类型为 va_list
的对象,它包含了参数信息。这种类型的对象也称为参数指针(argument pointer),它包含了栈中至少一个参数的位置。可以使用这个参数指针从一个可选参数移动到下一个可选参数,由此,函数就可以获取所有的可选参数。va_list
类型被定义在头文件 stdarg.h
中。
当编写支持参数数量可变的函数时,必须用 va_list
类型定义参数指针,以获取可选参数。在下面的讨论中,va_list
对象被命名为 argptr
。可以用 4
个宏来处理该参数指针,这些宏都定义在头文件 stdarg.h
中:
宏
va_start
使用第一个可选参数的位置来初始化argptr
参数指针。该宏的第二个参数必须是该函数最后一个有名称参数的名称。必须先调用该宏,才可以开始使用可选参数。1
void va_start(va_list argptr, lastparam);
展开宏
va_arg
会得到当前argptr
所引用的可选参数,也会将argptr
移动到列表中的下一个参数。宏va_arg
的第二个参数是刚刚被读入的参数的类型。1
type va_arg(va_list argptr, type);
当不再需要使用参数指针时,必须调用宏
va_end
。如果想使用宏va_start
或者宏va_copy
来重新初始化一个之前用过的参数指针,也必须先调用宏va_end
。va_end
被定义为空.它只是为实现与va_start配对(实现代码对称和”代码自注释”(根据代码就能知道功能,不需要额外注释)功能)1
void va_end(va_list argptr);
宏
va_copy
使用当前的src
值来初始化参数指针dest
。然后就可以使用dest
中的备份获取可选参数列表,从src
所引用的位置开始。1
void va_copy(va_list dest, va_list src);
1 |
|
简易printf
函数
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!