博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可变参数函数的实现
阅读量:6818 次
发布时间:2019-06-26

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

  对于可变参数函数获取其可变的参数,我们可以用下列宏来得到:

  #include

  void va_start(va_list ap, last);

  type va_arg(va_list ap, type);

  void va_end(va_list ap);

  void va_copy(va_list dest, va_list src);

  在没有深入理解实现原理的情况下,这些宏应该如何的使用总是很难记忆,因此有必要搞清楚可变参数函数实现基本原理。

  void variable_argument_func(int arg1, int arg2, ...)

  {

  //我们应该怎样获取,这些可变的参数呢?

  //首先我们要了解,他们是紧挨着arg0和arg1保存在调用函数堆栈上的。

  //由低到高为 arg1-arg2-可变参数1-可变参数2-...-可变参数n

  //我们假定编译器是连续存储这些变量的,并且没有任何对齐的限制。

  //如果想获得每一个可变参数,我们需要知道他们的首地址,已经每一个变量的类型

  int va1;

  int va2;

  int va3;

  void *va_p = &arg2 + 1; //通过最后一个固定变量,获得可变参数首地址

  va1 = *((int *)va_p); //依次获得每一个变量

  va_p += sizeof(int);

  va2 = *((int *)va_p);

  va_p += sizeof(int);

  va3 = *((int *)va_p);

  }

  可能注意到,我们上面用的全部是int类型的变量,因为这样能符合我先前的一个假设:所有参数是连续存储的,如果参数含有其他非4字节对齐的变量,类似上面的做法会出错误,这些特性依赖与编译器,所以我们应使用stdarg.h中的宏,我们实验的目的仅仅在于了解大概的实现原理。

转载于:https://www.cnblogs.com/deagle/articles/1999789.html

你可能感兴趣的文章
如何写一份优秀的java程序员简历
查看>>
Spark(一): 基本架构及原理
查看>>
ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)...
查看>>
微信小程序录音实现
查看>>
remove namespace from xml config file
查看>>
<转>从SRCNN到EDSR,总结深度学习端到端超分辨率方法发展历程
查看>>
excel 获取中文拼音首字母
查看>>
Mvvm简介
查看>>
云态势感知产品 - 沙箱高级威胁检测
查看>>
Window配置Redis环境和简单使用
查看>>
asp.net正则匹配嵌套Html标签
查看>>
mybatis表关联一对多
查看>>
Amazon RDS 上的 Microsoft SQL Server » 导入和导出 SQL Server 数据库
查看>>
微信小程序——时间戳的转换及调用
查看>>
【RS】Modeling User Exposure in Recommendation - 在推荐中建模用户的暴露程度
查看>>
Kibana5.6安装
查看>>
Java多线程-线程池ThreadPoolExecutor构造方法和规则
查看>>
Solr字段类型field type的定义
查看>>
CentOS6.4下编译安装Apache2.4+PHP5.6
查看>>
Atitit. Xss 漏洞的原理and应用xss木马
查看>>