今天看到个有趣的代码
看懵了,函数模板我知道,那三个点是啥玩意?
“…”
template < typename T, typename... Types>
void print(const T& firstArg, const Types&... args)
{.......}
万能Google
其实不用管他,那三个点也就是参数
但是有多少个参数?不知道,未定
啥类型的参数?不知道,未定
可变参数
例如:
void test01(…);
void test01(int …); // 也可以指定,只接受参数中的int类型
void test01(char c,…);
void test01(char c,int …);
…
还有我们最熟悉的printf和scanf**(注意:不同的编译器可能不一样)**
int printf (const char *__format, ...)
{
register int __retval;
__builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
__retval = __mingw_vprintf( __format, __local_argv );
__builtin_va_end( __local_argv );
return __retval;
}
/* Formatted Input
*/
_CRTIMP __cdecl __MINGW_NOTHROW int fscanf (FILE *, const char *, ...);
_CRTIMP __cdecl __MINGW_NOTHROW int scanf (const char *, ...);
_CRTIMP __cdecl __MINGW_NOTHROW int sscanf (const char *, const char *, ...);
- 既然有多个参数,那么程序如何计算有多少个参数?
typedef __builtin_va_list va_list
#define va_start(v,l) __builtin_va_start(v,l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)
#define va_copy(d,s) __builtin_va_copy(d,s)
基本步骤
va_list l1; // 创建一个参数列表
va_start(l1,T); // 定义参数列表的起点
va_arg(l1,T); // 定义参数列表指向,指向类型
va_end(l1); // 关闭,指针用完都要关闭
定义参数列表起点
函数定义的时候设置两个参数function(type a,…);
然后就可以设置a为列表起点
(不知道还有没有其他方法,那面对func(…)的可变参数如何处理?)
va_start(l1,a);
指针移动 va_arg(l1,type);
l1的指针指向下一个参数,并说明下一个参数的类型(可能是获取其大小?)
这里的type类型,并不是随意类型
默认参数提升
每次调用va_arg宏都会修改ap以指向下一个变量参数。
让指针指向NULL,va_end(l1);