printf-函数实现机制.pptxVIP

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
printf-函数实现机制

printf 函数实现机制软1101班 马语201192466136249864081025633716@1. printf函数简介格式说明普通字符printf 函数(格式化的输出函数)作用是向终端(或系统隐含指定的输出设备),输出若干个指定类型的数据。printf 函数的一般格式一般格式:printf (格式控制,输出表列);格式说明:由“%”和格式字符组成,如%d,%f等普通字符:原样输出的字符输出列表:需要输出的数据,可以是常量、变量或表达式1. printf函数简介例如:printf (“%d, %c”, i, c);printf (“Hello World!”);问题:1. printf函数简介可变参数列表由于printf 是函数,因此“格式控制”字符串和“输出列表”实际上都是函数的参数。其一般的函数表示形式为:printf (参数1,参数2, 参数3,…,参数n)需要解决的问题1.怎样让printf 函数知道传递了多少参数?2.printf 函数怎样访问这些参数?2. 可变参函数什么是可变参函数所谓含有变长参数的函数是指该函数可以接受可变数目的形参。如何实现可变参函数三个宏和一个栈va_startva_argva_end2. 可变参函数定义于“stdarg.h”中,用来保存函数参数2. 可变参函数低地址……“hello”“world”“\0”……栈的增长方向高地址函数调用栈对于c语言,它的调用规则遵循_cdecl调用规则:1.参数从右到左依次入栈2.调用者负责清理堆栈3.参数的数量和类型不会导致编译阶段的错误 2. 可变参函数例如:sizeof(n) = 14B = 1110B, 1110 FFFFFFFC = 1100 = 12 _INTSIZEOF(n) = (1110+0011 ) FFFFFFFC = 10000 = 1610001第一个宏:va_start参数: ap 为va_list类型指针, v是最后一个确定的参数,最后一个确定的参数的含义是指它以后的参数都是可变参数。功能:获取参数列表中的第一个可变参数的内存地址,结果存放在ap中。注:_INTSIZEOF() 宏是为了实现地址对齐的2. 可变参函数低地址……“hello”“world”“\0”……v栈的增长方向ap高地址第一个宏:va_start2. 可变参函数低地址……“hello”“world”“\0”……栈的增长方向apap高地址第二个宏:va_arg参数: ap 为va_list类型的指针,它指向当前需要获取的参数,t是当前参数的类型功能:获取ap当前所指向的参数的指针,并将其类型强制转化 t *,然后将ap指向下一个变长参数2. 可变参函数第三个宏:va_end参数: ap 为va_list类型指针功能: 将指针指向空,表明不再使用该指针注:C标准要求在同一个函数中 va_start 和 va_end 要配对出现2. 可变参函数定义于“stdio.h”中,用来保存函数参数2. 可变参函数可变长参数函数的一般实现方法:1. 声明原型,形如 void demo(char *msg,...),注意变长参数的原型声明中至少要含有一个确定参数;2. 用va_list 定义保存函数参数的数据结构,可以理解为一个指针变量;3. 用va_start 将上一步定义的变量指向第一个可变参数;4. 用va_arg 遍历所有的可变参数;5. 用va_end 将指针变量持有的地址值置为0。3. printf 函数实现在Linux内核中printf 函数被封装成下面的代码:startva_startvsprintf()va_argva_end3. printf 函数实现……参数1参数2……参数n……format低地址栈的增长方向argsargsargsargs高地址实现过程在vsprintf函数中,依次扫描format的每个字符,遇到%则调用va_arg取参数并移动参数栈指针,否则原样打印printf (参数1,参数2, 参数3,…,参数n)3. printf 函数实现printf 转换控制字符串的一般形式如下:% [flags] [width] [.prec] [type]flags:附加格式说明字符,如:- (左对齐),0(补零)width:域宽,如果宽度域中是数值则直接取其为宽度值。 如果宽度域中是字符*,表示下一个参数指定宽度。prec:正整数的最小位数 ?在浮点数中表示的小数位数 ?%g格式表示有效为的最大值 ?%s格式表示字符串的最大长度 ?若为*符号表示下个参数值为最大长度type:格式字符,如:d,c,f,s,o,x4. vsprintf 函数实现核心代码结构 vsprintf(sprint_buf, fmt, args);4. vsprin

文档评论(0)

zijingling + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档