c++ 可变参数用法
头文件
#include <stdarg.h>
使用
设你的函数签名是
int sum(int n, ...);
首先获得你的可变参数列表
va_list args;
va_start(args,n);
这里args是存储你的变量的指针,n是你的最后一个非可变参数
然后是获得所有参数
int vals[n];
for(int i=0;i<n;++i)
{
vals[i]=va_arg(args,int);
cout<<"arg "<<i<<" "<<vals[i]<<endl;
}
.
ok,结束了。当然你也可以最后加一句
va_end(args);
虽然这句话没有任何程序上的作用。
点评
宏确实是geek玩的东西,这正是c的独到之处。获得可变参数的原理很简单,args获得栈顶指针,根据类型读取相应字节,然后进行反编码返回给变量。
这里只摘录最有趣的 va_arg的实现
#define va_arg(list, mode) ((mode *)(list = \
(char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) & \
(__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1]
c果然余存着汇编的风韵,c#和java里是很难看到这种用法咯。
当然,这种用法的局限也是很明显的,也是不可克服的:我们得知道到底有几个参数,虽然这里的名字叫可变参数。
通常的方法有两种,第一种是像前面那样,直接指明可变参数的个数,printf和scanf也是如此,通过%来指明;第二种方法就是在可变参数的最后加个监视哨,类似于 '\0'
.
另外插个题外话,正是因为这种用法,所以scanf是有可能让你死机的呦~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2010-07-06 并行处理mpich2学习笔记
2010-07-06 C++获取当前进程的进程号方法
2010-07-06 linux下的编辑器