#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