在看疯狂iOS讲义,讲到形参个数可变的问题(p 155)用到了下面三个函数,我直接把函数原型找出来了

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

其中 va_list arg_ptr是定义了一个list型的变量,该变量是指向参数的指针

这些宏定义在stdarg.h va_start的第二个参数是第一个可变参数的前一个参数,是一个固定参数,

va_arg返回可变参数,第二个参数是你要返回的参数的类型

va_end宏结束可变参数的获取,然后你就可以在参数中使用第二个参数。若果有多个可变参数的,一次调用va_arg获取各个参数

下面是函数的定义,可以看到用了一个特别的宏:

typedef char * va_list;

#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

#define va_end(ap) ( ap = (va_list)0 )

这些函数原型有点复杂,我这里主要看的是这个_INTSIZEOF:

sizeof(n) “向上取整”成 sizeof(int) 的整数倍,用来地址对齐。

~的意思是按位取反,&的意思按位取与,就是除了都是两个数都是1,其他都是得0

我们取n是6,int就占4个字节,前半段:6+4-1=9

对于任何数,我们加上一个三,如果他是4的倍数,不会被不到下一个4的倍数,如果不满4的话,加上三补齐凑够4的倍数

然后看后半段有4-1=3,取二进制为(为了方便,就画八位):
0000 0011

再取反:

1111 1100

而此时,我们前半段得出的9的二进制为:

0000 1001

这两个数一取与,可以看到最后一个1被抹掉了

0000 1000

得出8了(就是辣么神奇)

参考或深入文章:

https://blog.csdn.net/u010476094/article/details/39527697

https://blog.csdn.net/edonlii/article/details/8497704

——我是太阳骑士索拉尔,愿阳光永照心中

关于可变参数函数+ _INTSIZEOF宏实现详细相关推荐

  1. #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号

    [Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...

  2. 关于C语言可变参数函数的一些研究和总结

    可变参数函数是指函数参数的个数.类型等是不固定的,需要在用户调用过程中,根据实际传入的参数来确定其类型.个数等信息.例如:可变参数函数printf可谓是在C开发过程中使用最多的标准输出库函数之一,因此 ...

  3. printf 函数使用 可变参数函数实现原理

    一. Printf 和scanf 函数格式 Printf 和 scanf 家族函数都属于可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. ...

  4. c语言中函数名可变,C语言中可变参数函数

    转帖两封: 首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理. 一.printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++ ...

  5. C语言可变参数函数(printf/scanf)

    C 语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function).这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(opti ...

  6. C/C++可变参数函数

    一.C可变参数函数 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数.但在某些情况下我们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数. ...

  7. c语言怎样获得函数内参数的值_C语言可变参数函数的实现原理

    在本人的<C语言可变参数函数的实现方法>一文中,介绍了如何建立自己的可变参数函数. 下面继续介绍可变参数函数的实现原理. 在汇编语言程序设计中,详细介绍了子程序的实现思想: (1)子程序只 ...

  8. 解析可变参数函数的实现原理(printf,scanf)

    From: http://hi.baidu.com/huifeng00/blog/item/085e8bd198f46ed3a8ec9a0b.html 学习C的语言的时候,肯定接触到标准输出和标准输入 ...

  9. 从printf谈可变参数函数的实现

    作者:戎亚新 摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒.printf这种对参数个数和参数类型的 ...

最新文章

  1. 《中国人工智能学会通讯》——12.38 知识库与 HTML 表格的融合
  2. OpenGL+VS2015+WIN10 demo
  3. 查询SDE数据库,GSON报错:declares mutiple JSON fields named data
  4. jsp+js实现二级级联
  5. 新的网站上线 linux视野
  6. 作者:桑基韬(1985-),男,博士,中国科学院自动化研究所副研究员
  7. centos php memcache扩展,linux centos 安装php的memcache扩展
  8. Magisk —— 安卓新一代的第三方拓展,systemless模式
  9. 随想录(qemu的学习)
  10. 闲聊libhybris
  11. Linux 杀死stuck线程,如何中断weblogic中stuck thread
  12. Homebrew太慢,如何挂代理加速
  13. 高数 | 利用定积分定义求极限
  14. 智慧城市建设的实践经验
  15. blastn、blastp、blastx、tblastn和tblastx的区别与用法
  16. html5制作心路历程,原创到伪原创 心路历程实战技巧
  17. postgresql.conf log_rotation_size
  18. Android知识架构 · Java的编程思想
  19. 关于webpack下载loader出现的问题(ERROR in ./src/img/timg.jpg Module build failed: ValidationError: File Loade)
  20. 导出excel此单元格中的数字为文本格式,或者其前面有撇号

热门文章

  1. SQUIRE: A Sequence-to-sequence Framework for Multi-hop Knowledge Graph Reasoning
  2. 计算机效果图线稿的制作方法,ps手把手教你把任意图片处理成线稿
  3. Java之implements
  4. spyder pyecharts不显示_优派XG270QG电竞显示器评测 四大金刚的继承者
  5. [Python] 用python做一个游戏辅助脚本,完整思路
  6. 富满电子鸿蒙系统,东吴证券--电子行业周报:HarmonyOS2.0助力AIOT生态体系发展
  7. 拆解“铜陵模式”,还原一个三线城市工业互联网转型的真实场景
  8. Python实战之如何爬取豆瓣电影?本文教你
  9. 雷鸟邮件--设置语言
  10. FLOPS、FLOPs、FPS