IT学习站-137zw.com

作者: 我是的十八簿
查看: 63|回复: 0

more +资源更新Forums

more +随机图赏Gallery

2019开运网付费开源商业版|风水起名八字算命易经周易源码...2019开运网付费开源商业版|风水起名八字算命易经周易源码...
网易课堂马丁的Illustrator(Adobe AI)大师课,90节完整版网易课堂马丁的Illustrator(Adobe AI)大师课,90节完整版
价值9999元 筑龙造价全专业(20191214_114251)精品课程推荐价值9999元 筑龙造价全专业(20191214_114251)精品课程推荐
微专业 - Java高级开发工程师(完整版)微专业 - Java高级开发工程师(完整版)
曾奇峰的心理课精神分析30讲,带你深入潜意识,解密你不...曾奇峰的心理课精神分析30讲,带你深入潜意识,解密你不...
词霸天下之3万词汇速记进阶 入门到精通彻底攻克英语完整版词霸天下之3万词汇速记进阶 入门到精通彻底攻克英语完整版

C、C++格式化字符串

C、C++格式化字符串

[复制链接]
我是的十八簿 | 显示全部楼层 发表于: 2019-11-14 13:50:03
我是的十八簿 发表于: 2019-11-14 13:50:03 | 显示全部楼层 |阅读模式
查看: 63|回复: 0
引言

在C和C++开发中,我们经常会用到printf来进行字符串的格式化,例如printf("format string %d, %d", 1, 2);,这样的格式化只是用于打印调试信息。printf函数实现的是接收可变参数,然后解析格式化的字符串,最后输出到控制台。那么问题来了,当我们需要实现一个函数,根据传入的可变参数来生成格式化的字符串,应该怎么办呢?
你可以在这里看到更好的排版
正文

可变参数

首先来一个可变参数使用示例,testVariadic方法接收int行的可变参数,并以可变参数为-1表示结束。va_list用于遍历可变参数,va_start方法接收两个参数,第一个为va_list,第二个为可变参数前一个参数,下面的例子里该参数为a。运行结果格式化字符串

好了,我们已经介绍了怎样实现一个接收可变参数的C函数,接下来介绍根据接收的可变参数来格式化字符串。这里介绍两种方式,第一种是利用宏定义,第二种通过函数的方式来实现。
通过宏定义的方式

en…让咱们先来看看第一个版本的宏,这个宏定义对于不熟悉宏的人来说可能看着有点费劲,不过不要怕,稍后会做解释,代码如下:宏基础知识

首先需要介绍宏用到的知识:\, 这个\的作用是可换行定义宏,毕竟如果一行很长的宏可读性很差,使用方式在换行时加上\即可。第二个是介绍(format, ...),这里的...是预定义的宏,用于接收可变参数,就像是printf函数一样。接着介绍##__VA_ARGS__,同样的__VA_ARGS__也是预定义的宏,表示接收到的...传入的可变参数。##的作用是用来处理未传入可变参数的情况,当没有传入可变参数的时候,编译器或通过优化将snprintf(NULL, 0, format, ##__VA_ARGS__);优化为snprintf(NULL, 0, format);。你可以理解为没有可变参数时,##前的逗号,与__VA_ARGS__都被“干掉了”。
你一定会觉得困惑,为什么要写do-while语句呢?这是为了宏的健壮性,如果使用宏的人像下面这样使用的话,就会出问题上面的代码连编译都不会通过, 会报错如下:
C、C++格式化字符串  技术博客 macro_1


如果手动展开这个宏的话,会变成这个样子,问题就显而易见了。但是如果if语句加上了{}的话,就不会有问题,可以看出规范写法是多么的重要
来源:http://www.137zw.com
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
137zw.com IT学习站致力于免费提供精品的java技术教程和python技术教程,CCNA书籍/资料/CCNP书籍/资料教程/CCIE书籍/资料/H3C学习/认证/一级建造师考试/微软学习/认证/包括基础教程和高级实战教程,同时也提供分享网站源码下载和互联网相关一系列的技术教程,我们想做的就是让知识分享更有价值!(IT学习站官方唯一域名地址:www.137zw.com 请谨防假冒网站!)本站所有资源全部收集于互联网或网友自行分享,分享目的仅供大家学习与参考,如无意中侵犯您的合法权益,请联系本站管理员进行删除处理!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

浙ICP备19022368号-1|Archiver|手机版|IT学习站-137zw.com

GMT+8, 2020-7-4 18:19 , Processed in 0.465873 second(s), 33 queries .

快速回复 返回顶部 返回列表