博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 可变参数用法
阅读量:7207 次
发布时间:2019-06-29

本文共 813 字,大约阅读时间需要 2 分钟。

头文件

 
#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是有可能让你死机的呦~

转载地址:http://wzlum.baihongyu.com/

你可能感兴趣的文章
简单工厂模式(C++)
查看>>
关于Java中的Arrays.copyOfRange()方法
查看>>
正确地黑C
查看>>
一个程序员的自白(三十而立)
查看>>
生产者、消费者、队列
查看>>
关于java中的==,equal,new,= 的一些相关知识(有点乱)
查看>>
一种NVMe SSD友好的数据存储系统设计
查看>>
IT168采访记录
查看>>
oracle删除一个用户
查看>>
老男孩教育学员参观机房实践活动
查看>>
《企业云桌面实施》-小技巧-08-建筑设计行业-真实效果-漫游动画-三维视图渲染...
查看>>
SUSE LINUX系统文件句柄限制的修改
查看>>
贺双节,签名版限量特惠
查看>>
警惕“***性社工”现象
查看>>
Exchange 2013与OWA13集成
查看>>
有话请直说
查看>>
虚机不能启动的特例思考
查看>>
OSPF概述
查看>>
自动化部署操作系统-Kickstart+PXE自动部署
查看>>
Eclipse europa 更新时 Error retrieving "feature.xml". [error in opening zip file]的解决
查看>>