剖析可变参数列表源码

首先,我们先用可变参数写俩个简单的函数

 

求任意个参数的平均值和最大值

#include<stdio.h>
#include<stdarg.h>
int Average(int n, ...)
{
	va_list arg;
	int sum = 0;
	int i = 0;
	va_start(arg, n);
	for (i = 0; i < n; i++)
	{
		sum += va_arg(arg, int);
	}
	return sum / n;
	va_end(arg);
}

int Max(int n, ...)
{
	va_list arg;
	va_start(arg, n);
	int i = 0;
	int max = va_arg(arg, int);
	for (i = 0; i < n - 1;i++)
	{
		int ret = va_arg(arg, int);
		if (ret > max)
		{
			max = ret;
		}
	}
	return max;
	va_end(arg);
}
int main()
{
	int num = 0;
	num = Average(7, 1, 2, 3, 4, 5, 6, 7);
	printf("%d\n", num);
	num = Max(6, 1, 2, 7, 5, 6, 8);
	printf("%d\n", num);
	return 0;
}

在实现可变参数函数时,我们需要引头文件#include<stdarg,h>

 

 

va_list arg; 这句代码可以理解为:char* va_list;

 

 

 

va_start(arg, n); 这句代码可以理解为 :(arg = (char*)&n + 4);

 

 

 

                            #define _ADDRESSOF(v) (&(v))

                            #define _INTSIZEOF(n)          ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))

                            #define va_start __crt_va_start

                            #define __crt_va_start(ap, x) __crt_va_start_a(ap, x)

 

 

                            #define __crt_va_start_a(ap, v) ((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)))

 

 

 

va_arg(arg, int);这句代码可以理解为:( *(int *) ((arg  += 4) - 4);

                            #define va_arg   __crt_va_arg

                            #define __crt_va_arg(ap, t)     (*(t*)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)))

 

 

va_end(arg); 这句代码可以理解为:(arg = (char*)0);

                            #define va_end   __crt_va_end

                            #define __crt_va_end(ap)        ((void)(ap = (va_list)0))

 

 

如有不足之处请见谅,并批评指正。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值