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

来源:互联网 发布:淘宝店旺铺是什么 编辑:程序博客网 时间:2024/06/05 03:41
#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;}

0 0