可变参数的实现原理

本文详细介绍了C语言中可变参数的实现原理,包括va_list、va_start、va_arg和va_end的使用,以及_INTSIZEOF宏的作用。内容涵盖了可变参数的限制,如需要知道第一个参数的地址和每个参数的类型。还探讨了内存对齐和字节对齐在实现中的重要性,并提供了一些参考链接以深入理解。
摘要由CSDN通过智能技术生成

可变参数

  1. 参数个数可变
  2. 参数类型可变

原理概述

由于在函数调用时,参数通过栈进行传递(stdcall、cdecl)而且参数入栈时会按照顺序依次入栈。
所以在被调用的函数内,知道了第一个参数的地址就可以根据类型获得其他参数的地址从而获取参数的值.
这里需要注意的一点:
上面提到的stdcall和cdecl是说明这两种参数都是通过栈传递,但是只有cdecl支持可变参数,因为cdecl由调用者维护栈平衡
另外,可变参数的限制有两个:

  1. 必须知道第一个参数的地址,也就是说函数内不能全部都是可变参数。可以把第一个参数设置为可变参数的数量,因为可变参数类型可变,个数可变,并不能规定一个通用的结束标志。例如printf这样的函数,都是根据第一个字符串内的%d这样占位符的数量确定参数个数,所以后面的可变参数不匹配就会出错甚至崩溃
  2. 必须知道每个参数的类型,因为不知道参数确切的类型,即使参数排列在连续的内存区域但是仍然无法知道每个参数的起始地址。这也是printf需要使用%d,%f这样来区分类型的原因

具体实现

头文件:stdarg.h
用到的宏:

功能 参数说明
va_list 可变参数类型,实际上是一个char* 指针
va_start 初始化va_list 传入va_list对象和起始参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值