Vaget - <varargs.h>自实现+分析流程+代码实例

不知在座各位有没有想过,为什么printf,scanf的函数参数总是不定长呢?这是“惯例”?恐怕不是,我以前倒想过,解决方案是void*列表(笑),但完全无法用,遂弃。到后来深入了解C语言时,终于发现了stdargs.h和varargs.h(已弃用)这些宏库。凭借着{...}变参语法和自己对C语言的了解,简单地搓了一个变参宏Vaget。分析流程和代码实例见文末。

// Link Here: //
typedef char* va_lst;
#define va_mcl ...
#define va_start(val,mod) ((char*)(&val)+sizeof(mod))
#define va_get(va,mod)  (*((mod*)va))
#define va_pas(va,mod)  (va+=sizeof(mod),0)
// LnkEnd     //

上面的Vaget实现包含了一组宏和一个typedef将char*包装,宏va_mcl作为函数参数需放在列表的末尾,宏va_start启用参数列表,va_get获得mod类型的参数,va_pas用来取得宏列表的下一项

以上便是对这组宏的简析了。

分析流程

首先让我们做一个小小的假定,所有参数的内存地址是连续的,也就是说,foo(int a,int b,int c),则内存分配如下(每一个【:】都代表一字节)

|::::|::::|::::|              12 Bytes
 a    b    c
// 当sizeof(int)为(size_t)4时

那么,我们只需要知道a的内存地址,就能推断出b,c的内存地址,自然而然能取其值了。

// 当a的内存地址为0x70时
a:  0x70
b:  0x74  = a+sizeof(int)
c:  0x78  = a+sizeof(int)+sizeof(int) = b+s
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值