简介
采用变参的最典型函数就是printf,其参数个数可变,类型也可变,基本原型如下
return_type func(fixarg, ...)
包含一个或者以上的固定参数,...表示后续参数个数和类型不定
实现原理与使用
c中提供了如下的类型和函数(宏),使我们能够自定义自己的变参函数并使用
va_list、va_start、va_arg、va_end
一个典型的demo如下
#include <stdarg.h>
int func(int fixarg, ...){
va_list pargs = NULL;
va_start(pargs, fixarg);
int narg = va_arg(pargs, int);
...
va_end(pargs);
}
va_list定义了一个指针,va_start作用是让pargs指向固定参数后面的第一个变参的地址,va_arg是从parg指针位置开始获取参数,对于默认cdec调用管理下,传进来的参数在栈中的结构如下
获取变参原理
这里只是简单介绍了一下变参的基本实现方式,实际还和栈中参数对齐,调用管理等相关,同时变参的使用还有许多需要注意的地方,这里不在一一列举,如非必要尽量不要用变参。具体一些其他介绍可参考这篇文章可变参数函数详解
网友评论