当前位置:网站首页>1310_一个printf的实现分析
1310_一个printf的实现分析
2022-07-25 05:06:00 【grey_csdn】
全部学习汇总: GitHub - GreyZhang/c_basic: little bits of c.

从这个地方能够看出,虽然我们在调用printf,但是这个模块中实现的函数实际上是printf_,只是通过宏定义的技巧做了一个巧妙的转换。这样可以保持原来大家写代码的习惯,同时避免了库文件中可能的printf冲突。

关于va_list、va_start、va_end的使用,通过一个例子来看一下。

上面的这个例子,能够看得出来几个宏的简单使用情况。同时,还增加了一个va_arg的使用。先把这个代码编译运行一下。

这是上面的代码编译、运行的效果。其实,这里有一个很关键的地方。虽然这几个va_xxx的用法实现了函数变参数的调用情况,但是实际上这个参数的数目是无法自动识别的,而是通过代码自己来控制的。这个是什么意思呢?我们把代码做一下修改就能够看出这样的一个结论了。

如上面的代码,我把count的参数改成3,后面的参数依然是4个。那么,这样的编译运行效果是什么呢?

这个是上面代码编译运行的效果。从这个结果看,其实输入了5个参数最终程序只是识别到了4个。这4个,可以理解为是一个1 + 3的结果,而前面的第一个参数count则是决定了最终应该要取几个参数。也就说,这个参数的数目识别无法做到自动化或者智能化,只能够自己来做程序级别的判断。如此,继续前面的分析。

这样,我们再来看这个函数的实现。其实关键点就会转移到_vsnprintf函数的使用上。_vsnprintf函数,调用了一个字符输出函数,前面的一个临时buffer,之后把printf_的传入参数完全继承过去了。


再看一下这个函数的基本的参数:第一个参数其实是一个函数类型,在上面一起附加了这个定义;第二个参数是一个指向字符的指针,从名称来看应该是字符的缓冲区,第三个是最大长度,第四个和第五个参数来自于printf_函数。
接下来的一个判断就是看这个字符buffer是否是一个有效字符,如果不是那么就不用输出,调用的输出函数也是一个无输出函数。上面的printf_定义了一个有效的buffer,其实也是保证了这个地方不会让有效的out被覆盖掉。

继续往下,如果输入的参数不是%开头的,也就是说字符可以直接输出。否则的话,参数的处理往后移动一下。



上面这么多的内容,其实只是做了一个格式的判断。如果,要想给这个pritnf继续瘦身的话,这里面有一些我不常用的参数比如,j,z等等,我都可以直接去掉。


这部分的代码截取不是很完整,但是理解起来其实是容易的。这里处理的都是数字类的信息,首先进行了一个模的判断,获知到底是多少进制。这里一看大概就能够知道接下来他的处理方式,零散的小功能分析我就不去分析了。另外一个比较巧妙的地方在于正负值的处理,直接通过这个将处理逻辑一分为二。处理完之后,数据的显示格式转换以及输出是打包在一块实现的。

这里是浮点以及科学计数法的一个实现支持。

这里是字符以及字符串的打印,每一次的处理其实都考虑格式的转换,可能因此导致输出的内容比buffer要多一些,主要的功能还是在于填充以及对齐的方面。如果只是为了做嵌入式软件的调试,其实这样的功能也是可以将就的,可以从中剔除一部分设计。

后面的输出也没有什么太多的需要说明的了,这里输出了一个%,其实是只有%但是没有数据格式的时候,那就可以直接输出一个%结束。
这么看下来,其实整个printf的实现还是很简单的,关键点其实就在于这个vsnprintf的实现。

在我用的这一份代码中,还有这样的几个函数。其实,这几个函数对我平时的使用来说几乎是没啥用途的,因此,也是可以直接优化掉的。我直接尝试做一个代码的屏蔽,之后进行整个工程的编译测试。

结果跟我预想的一样,没有什么编译或者链接上的问题。看起来,我用的这个小工具在资源上可以继续裁剪一下了。
边栏推荐
- [literature notes] pointmlp
- Compile ue5.0
- 基于云原生的私有化 PaaS 平台交付实践
- 龙蜥社区发布首个 Anolis OS 安全指南 为用户业务系统保驾护航
- Style transfer -- CCPL: contrast coherence preserving loss for versatile style transfer
- 使用getifaddrs获取本机网口IP地址
- Detailed explanation of security authentication of mongodb
- 85 distributed project construction
- Etcd learning
- Data link layer protocol -- Ethernet protocol
猜你喜欢

初步了解Panda3d粒子系统

HMS core discovery Episode 16 live broadcast preview | play AI's new "sound" state with tiger pier

Your technical leader doesn't understand this? Without it, there is no complete thinking process of design

rhcsa暑假第三天

epoll的实现原理

Small case of data analysis: visualize recruitment data and view the most needed technologies in the field~
Set up private CA server

Delivery practice of private PAAS platform based on cloud native
[small program practice] first day

Introduction to CpG control network
随机推荐
2022-7-18 summary
Ora-01460: conversion request cannot be implemented or unreasonable
Getting started with scratch
[CTF learning] steganography set in CTF -- picture steganography
38 lines of PHP code free import database analysis Linux access log
Teach you how to locate unreasonable SQL? And optimize it
Which website is suitable for physical server
After watching the latest interview with big manufacturers, these six JVM interview questions were asked
Json.tojsonstring cannot pass Boolean
[the most comprehensive and detailed] how to design a database and table splitting scheme that can dynamically expand and shrink capacity?
Ownership in rust -- introduction of rust language Xiaobai 11
学习记录[email protected]研发效能度量指标
How can I check if the number of RDS links in MySQL suddenly rises?
Harbor installation
Dragon Dragon community released the first Anolis OS Security Guide to escort users' business systems
Deep understanding of pod
Ffmpeg download and installation
[literature notes] pointmlp
Anaconda installs jupyter
ESWC 2018 | R-GCN:基于图卷积网络的关系数据建模