__builtin_va_list,三个点,可变参数

这篇博客探讨了C++中的函数模板和可变参数技术。通过示例代码,解释了‘…’在函数模板中的作用,即表示参数数量和类型可以是不确定的。作者提到了`va_list`、`va_start`、`va_arg`和`va_end`等宏用于处理可变参数列表,并指出这些宏在处理多个参数时的重要性,特别是在`printf`和`scanf`这样的函数中。博客还介绍了如何通过宏来遍历和处理可变参数列表。
摘要由CSDN通过智能技术生成

今天看到个有趣的代码
看懵了,函数模板我知道,那三个点是啥玩意?

“…”

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 *, ...);
  1. 既然有多个参数,那么程序如何计算有多少个参数?
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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值