#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等利用宏定义实现可变参数
原文地址:http://blog.csdn.net/dream890527/article/details/43345195