码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-31 21:55:54      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:32位   c语言         指针   

#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等利用宏定义实现可变参数

标签:32位   c语言         指针   

原文地址:http://blog.csdn.net/dream890527/article/details/43345195

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!