欢迎光临散文网 会员登陆 & 注册

TinyFormat 源码阅读(二)

2022-09-06 01:04 作者:Meriex  | 我要投稿

那从这一章开始我们正式进入 tinyformat ,首先是 tfm::format 函数,一起来看一下它的定义:

那这里的话和上一章的代码风格基本类似,同样是借助 TINYFORMAT_FOREACH_ARGNUM 来生成出多个版本的 format 函数,而功能的实现则放在 vformat 中我们待会再来看,首先看一下这里向 vformat 中传入的参数有一个 makeFormatList ,通过之前的用例我们应该知道这里传入的是用于填充 fmt 串的参数,一起来看一下它的定义:

这里开始有更多需要拓展的内容了,我们比较熟悉的 TINYFORMAT_FOREACH_ARGNUM 先放在一边,这里的返回值是在 detail 命名空间下的 FormatList 类型,那同样一起来看看它的定义:

可以看到这个类的功能就是把传入的参数一起打包封装到 FormatListNm_formatterStore 成员中,构造函数结合 init 实现了一个递归的初始化方式(TINYFORMAT_PASSARGS_TAIL 的实现从第二个参数开始取值,所以每次调用参数都会减少):

看完了构建参数的过程,我们回到本章真正的核心, vformat 函数,它的定义是这样的:

其中 FormatListRef 是指向 FormatListconst 引用:

如果之前只关注 FormatListN 而没有看到 FormatList 的话,前者是后者的父类,在构造函数中通过 : FormatList(&m_formatterStore[0], n) 传递了初始化好的参数数组指针 m_args 和参数长度 m_N

这里我们先抛开一些错误状态的处理,先来看主要流程,传入的 fmt 串要通过 printFormatStringLiteral 函数进行第一步处理,看一下它的定义:

这段代码实际上 c 风格比较明显,作用的话就是找到 fmt 中的第一个需要填充参数的位置并返回, c-fmt 通过两个指针相减算出子串的长度,返回剩余部分。

篇幅原因本节关于 TinyFormat 的源码阅读就先到这里,下一节我们再继续阅读串解析以及流状态的部分,再会!

TinyFormat 源码阅读(二)的评论 (共 条)

分享到微博请遵守国家法律