首页 > 代码库 > va_list、va_start、va_arg、va_end等利用宏定义实现可变参数

va_list、va_start、va_arg、va_end等利用宏定义实现可变参数

#include <stdio.h>
//#include <stdlib.h>
//#include <stdarg.h>
//int sum(int n, ...);

typedef  void* va_list;
#define _INTSIZEOF(arg) ((sizeof(arg) + sizeof(int) - 1)&(~(sizeof(int) - 1)))    //字节对齐,针对32位系统
#define va_start(arg,start) arg = (va_list)(((unsigned char *)&(start)) + _INTSIZEOF(start))  //利用函数栈,参数从右向左入栈,栈顶为第一个参数
#define va_arg(arg,type)  *(type*)arg;arg = (char *)arg +  _INTSIZEOF(type);  //修改栈顶指针
#define va_end(arg) arg = NULL;	

int sum(char n, ...)
{
	int i = 0;
	int result = 0;
	va_list arg;

	va_start(arg, n);
	for (i = 0; i < n; i++)
	{   
		result += va_arg(arg, char);
	}
	va_end(arg);
	return result;
}




int main()
{    
	printf("%d", sum(2, 4, 5));

	getchar();

	return 0;
}





va_list、va_start、va_arg、va_end等利用宏定义实现可变参数