C语言变参函数的实现原理
2024-09-20 10:24:35
1. 变参函数简单示例
#include <stdarg.h>
#include <stdio.h> int Accumlate(int nr, ...)
{
int i = ;
int result = ;
va_list arg = NULL;
va_start(arg, nr); for(i = ; i < nr; i++)
{
result += va_arg(arg, int);
} va_end(arg); return result;
} int main()
{
printf("%d\n", Accumlate(, ));
printf("%d\n", Accumlate(, , ));
printf("%d\n", Accumlate(, , , )); return ;
}
2. 变参函数的实现原理
#define va_list void*
#define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start))
#define va_arg(arg, type) *((type*)arg); arg = (char*)arg + sizeof(type);
#define va_end(arg) arg = 0;
#include <stdio.h> #define va_list void* #define va_start(arg, start) arg = (va_list)(((char*)&(start)) + sizeof(start)) #define va_arg(arg, type) *((type*)arg); arg = (char*)arg + sizeof(type); #define va_end(arg) arg = NULL; int Accumlate(int nr, ...)
{
int i = ;
int result = ;
va_list arg = NULL;
va_start(arg, nr); for(i = ; i < nr; i++)
{
result += va_arg(arg, int);
} va_end(arg); return result;
} int main()
{
printf("%d\n", Accumlate(, ));
printf("%d\n", Accumlate(, , ));
printf("%d\n", Accumlate(, , , )); return ;
}
3. 关于参数结束标志的问题
① 指定参数个数,如示例代码
② 用固定值(如-1或NULL)表示最后一个参数
③ 用格式化字符串,如printf函数
注:变参函数至少要提供一个参数
最新文章
- 谈谈Redis的SETNX
- 安装运行Hadoop
- Leetcode: Design Snake Game
- 删除html元素
- 通过Ajax post Json类型的数据到Controller
- 编译QT时出现lib/libQtGui.so: undefined reference to `ts_read_raw&#39;的解决办法
- Spark Mllib逻辑回归算法分析
- [POJ2828]Buy Tickets(线段树,单点更新,二分,逆序)
- 最常用的动态sql语句梳理——分享给使用Mybatis的小伙伴们!
- poj 2533 Longest Ordered Subsequence(线性dp)
- c++空指针调用类成员函数
- Hadoop大数据面试--Hadoop篇
- 自动同步Android源代码的脚本(repo sync)
- 按钮(Buton)组价的功能和用法
- 对于java中的";\";和";/";&#160;区别
- Darknet windows移植(YOLO v2)
- crontab 选择编辑器 select-editor
- 目标检测(四)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- 解决当FORM的ENCTYPE=";multipart/form-data"; 时request.getParameter()获取不到值的方法
- 【Atcoder】ARC102 题解