C可变参数的函数
我们实现一个简单的printf函数(可变参数)
#include <stdio.h>
#include <stdarg.h>
void myprintf(const char *format, ...)
{
va_list ap;
char c;
va_start(ap, format);
while (c = *format++) {
switch(c) {
case 'c': {
char ch = va_arg(ap, int);
putchar(ch);
break;
}
case 's': {
char *p = va_arg(ap, char *);
fputs(p, stdout);
break;
}
default:
putchar(c);
}
}
va_end(ap);
}
int main(void)
{
myprintf("c\ts\n", '', "hello");
return ;
}
要处理可变参数,需要用C标准库的va_list类型和va_start、va_arg、va_end宏,这些定义在stdarg.h头文件中。我们首先对照反汇编分析在调用myprintf函数时这些参数的内存布局。
aaarticlea/png;base64,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" alt="" />
aaarticlea/png;base64,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" alt="" />
myprintf函数的参数布局
aaarticlea/png;base64,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" alt="" />
这些参数是从右向左依次压栈的,所以第一个参数靠近着栈顶,第三个参数靠近栈底。这些参数在内存中是连续存放的,每个参数都对齐到4字节边界。第一个和第三个参数都是指针类型,各占4个字节,虽然第二个参数只占一个字节,但为了使第三个参数对齐到4字节边界,所以第二个参数也占4个字节。现在给出一个stdarg.h的简单实现
/* stdarg.h standard header */
#ifndef _STDARG
#define _STDARG
/* type definitions */
typedef char *va_list;
/* macros */
#define va_arg(ap, T) \
(* (T *)(((ap) += _Bnd(T, 3U)) - _Bnd(T, 3U)))
#define va_end(ap) (void)0
#define va_start(ap, A) \
(void)((ap) = (char *)&(A) + _Bnd(A, 3U))
#define _Bnd(X, bnd) (sizeof (X) + (bnd) & ~(bnd))
#endif
这个头文件中的内部宏定义_Bnd(X, bnd)将类型或变量x的长度对齐到bnd+1字节的整数倍,例如_Bnd(char, 3U)的值是4, _Bnd(int, 3U)也是4。
在myprintf中定义的va_list ap;其实是一个指针,va_start(ap, format)使ap指向format参数的下一个参数,也就是指向上图中esp+4的位置。然后va_arg(ap, int)把第二个参数的值按int型取出来,同时使ap指向第三个参数,也就是指向上图中esp+8的位置。然后va_arg(ap, char *)把第三个参数的值按char *型取出来,同时使ap指向更高的地址。va_end(ap)在我们的简单实现中不起任何作用,在有些实现中可能把ap改写成无效值,C标准要求在函数返回前调用va_end。
如果把myprintf中的char ch = va_arg(ap, int);改成char ch = va_arg(ap, char);,用我们的简单实现是没有问题的。但如果改用libc提供的stdarg.h,在编译时会报错:
aaarticlea/png;base64,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" alt="" />
因此要求char型的可变参数必须按int型来取,这是为了与C标准一致。
从myprintf的例子可以理解printf的实现原理,printf函数根据第一个参数(格式化字符串)来确定后面有集合参数,分别是什么类型。
还有一种方法可以确定可变参数的个数,就是在参数列表的末尾传一个Sentinel,例如NULL。execl()就采用了这种方法确定参数的个数。
C可变参数的函数的更多相关文章
- [Effective JavaScript 笔记]第22条:使用arguments创建可变参数的函数
第21条讲述使用可变参数的函数average.该函数可处理任意数量的参数并返回这些参数的平均值. 如何创建可变参数的函数 1.实现固定元数的函数 书上的版本 function averageOfArr ...
- PHP基础语法: echo,var_dump, 常用函数:随机数:拆分字符串:explode()、rand()、日期时间:time()、字符串转化为时间戳:strtotime()可变参数的函数:PHP里数组长度表示方法:count($attr[指数组]);字符串长度:strlen($a)
PHP语言原理:先把代码显示在源代码中,再通过浏览器解析在网页上 a. 1.substr; //用于输出字符串中,需要的某一部分 <?PHP $a="learn php"; ...
- C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数
在定义可变参数的函数之前,先来理解一下函数参数的传递原理: 1.函数参数是以栈这种数据结构来存取的,在函数参数列表中,从右至左依次入栈. 2.参数的内存存放格式:参数的内存地址存放在内存的堆栈段中,在 ...
- JavaScript Arguments 实现可变参数的函数,以及函数的递归调用
//可变参数的函数 注:也可以使用对象作为参数来实现 function Max() { var temp = arguments[0] || 0; for (var i = 1; i < arg ...
- c 可变参数 定义可变参数的函数
定义可变参数的函数,需要在stdarg.h头文件中定义的va_list类型和va_start.va_arg.va_end三个宏. 定义可变参数函数 va_list ap; //实际是定义一个指针va ...
- C语言中可变参数的函数(三个点,“...”)
C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...
- C/C++中带可变参数的函数
1.带可变参数的函数由来 当函数中的参数个数不确定时,这时候就需要带可变参数的函数! 如我们经常使用的C库函数printf()实际就是一个可变参数的函数, 其原型为: int printf( cons ...
- C++学习之可变参数的函数与模板
所谓可变参数指的是函数的参数个数可变,参数类型不定的函数.为了编写能处理不同数量实参的函数,C++11提供了两种主要的方法:如果所有的实参类型相同,可以传递一个名为initializer_list的标 ...
- 可变参数的函数(c++)【转载】
摘自<c语言精彩编程百例>,要定义可变参数的函数,在c++当中当包含<cstdarg>,在c语言当中当包含<stdarg.h>,使用任何可变长度的变元被访问之前,必 ...
随机推荐
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- ABP文档 - 通知系统
文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...
- 利用CSS中的:after、: before制作的边三角提示框
小颖昨天分享了一篇参考bootstrap中的popover.js的css画消息弹框今天给大家再分享一篇使用:before和:after伪元素画消息弹框的CSS. 画出来是介个酱紫的: 有没有觉得画的萌 ...
- 关于 devbridge-autocomplete 插件多选操作的实现方法
目前据我所知最好用的 autocomplete 插件就是 jquery-ui 的 autocomplete 以及 devbridge 的 autocomplete 插件. 我最终选择了 devbrid ...
- javascript之活灵活现的Array
前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...
- Http请求
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. 请求报文 一个HTTP请求报文由请求行(request line ...
- Solr 排除查询
前言 solr排除查询也就是我们在数据库和程序中经常处理的不等于,solr的语法是在定语前加[-].. StringBuilder sbHtml=new StringBuilder(); shBhtm ...
- 脑洞大开之采用HTML5+SignalR2.0(.Net)实现原生Web视频
目录 对SignalR不了解的人可以直接移步下面的目录 SignalR系列目录 前言 - -,我又来了,今天废话不多说,我们直接来实现Web视频聊天. 采用的技术如下: HTML5 WebRTC Si ...
- 总结30个CSS3选择器
或许大家平时总是在用的选择器都是:#id .class 以及标签选择器.可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选择器,希望对大家有所帮助. 1 *:通用选择器 ;; ...
- [Django]用户权限学习系列之User权限基本操作指令
针对Django 后台自带的用户管理系统,虽说感觉还可以,但是为了方便用户一些操作,特别设计自定义的用户权限管理系统. 在制作权限页面前,首先需要了解权限和用户配置权限的指令,上章讲到权限的添加,删除 ...