首页 > 代码库 > 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等利用宏定义实现可变参数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。