1.认识

变长參数是C语言的特殊參数形式。比如例如以下函数声明:

int printf(const char *format, ....);

如此的声明表明,printf函数除了第一个參数类型为const char*之外,其后能够追加随意数量、随意类型的參数。

printf的实现,粗略地举个样例。

如果lastarg是变长參数函数的最后一个具名參数(比如printf里的format),那么在函数内部定义类型的va_list的变量:

va_list ap;

该变量以后将会依次指向各个可变參数。

ap必须用宏va_start初始化一次,使其指向第一个不定參数,当中lastarg必须是函数的最后一个具名參数。

va_start(ap, lastarg);

此后,能够使用va_arg宏来获取当前不定參数的值,并依据当前不定參数的类型将指针移向下一个參数(假如已其其类型为type):

type current = va_arg(ap, type);

在函数结束前。必须用宏va_end来清理现场。

变长參数的实现得益于C语言默认的cdecl调用惯例的自右向左压栈传递方式,个中细节不作详述。

接下来用宏来实现变长參数。

2.宏实现

最新文章

  1. C#多任务并行阶段控制—— Threading.Barrier
  2. R扩展包
  3. MAC上显示隐藏文件夹
  4. BZOJ3740 : pku2842 N-dimension Matching N维匹配
  5. nginx location 的配置
  6. canvas基本画图
  7. 关闭窗体后,利用StreamWriter保存控件里面的数据
  8. C#List<long>与String(Linq)
  9. yum安装CDH5.5 Hadoop集群
  10. hdu 1068 Girls and Boys 最大独立点集 二分匹配
  11. socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放
  12. PHP 7 新特性
  13. Idea批量修改变量名
  14. 【linux】linux查找功能
  15. sublime3 快速运行 java
  16. jenkins和sonar的几个问题
  17. python-mysql数据库导表存excel后发邮件(实例2)
  18. margin重叠现象
  19. wget 报错 OpenSSL: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failur
  20. 网络编程之IO模型

热门文章

  1. sqlldr Field in data file exceeds maximum length "
  2. [LOJ6436]神仙的游戏
  3. 【分块】【树状数组】bzoj3787 Gty的文艺妹子序列
  4. CentOS正确关机方法(转)
  5. ueditor-angular(百度编辑器angular版)中,关于插入图片后不操作,图片无法正常提交的问题;
  6. 直接拿来用!最火的Android开源项目(一)
  7. css3动画和JS+DOM动画和JS+canvas动画比较
  8. python3发送html格式的邮件
  9. python 字典dict和列表list的读取速度问题, range合并
  10. javascriptMVC框架面向对象编程