当前位置: 首页 > news >正文

网络基础知识点seo点击软件排名优化

网络基础知识点,seo点击软件排名优化,那些网站使用vue做的,门户网站的建设方式有哪些C/C杂谈-printf的可变参数机制 文章目录 C/C杂谈-printf的可变参数机制printf的使用printf的源码源码剖析 多参数实现机制原理 C11引入了可变参数模板机制#xff0c;对模板参数进行了高度泛化#xff0c;但是对于可变参数其实C语言学习中早已遇到过#xff0c;那就是printf…C/C杂谈-printf的可变参数机制 文章目录 C/C杂谈-printf的可变参数机制printf的使用printf的源码源码剖析 多参数实现机制原理 C11引入了可变参数模板机制对模板参数进行了高度泛化但是对于可变参数其实C语言学习中早已遇到过那就是printf可以进行多参数的输出这是怎么实现的呢 printf的使用 我们对于printf的用法无非两种 const char *str hello , world\n;printf(str);//直接传入字符串地址int year 2023;printf(%d%s, year, 原神启动);//传入格式控制字符串地址和参数我们printf的参数是先是一个字符串后面才是我们的输出变量可以嗅出printf对于多参数的控制应该和传入的第一个字符串有关那么究竟是如何实现的呢 printf的源码 //acenv.h typedef char *va_list; #define _AUPBND (sizeof (acpi_native_int) - 1) #define _ADNBND (sizeof (acpi_native_int) - 1)#define _bnd(X, bnd) (((sizeof (X)) (bnd)) (~(bnd))) #define va_arg(ap, T) (*(T *)(((ap) (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND)))) #define va_end(ap) (void) 0 #define va_start(ap, A) (void) ((ap) (((char *) (A)) (_bnd (A,_AUPBND)))) //start.c static char sprint_buf[1024]; int printf(char *fmt, ...)//格式控制字符串和C的函数多参数 {va_list args;//va_list就是char * 的typedefint n;va_start(args, fmt);n vsprintf(sprint_buf, fmt, args);va_end(args);write(stdout, sprint_buf, n);return n; } //unistd.h static inline long write(int fd, const char *buf, off_t count) {return sys_write(fd, buf, count); }源码剖析 映入眼帘的就是一串宏定义 看我们printf的函数参数部分char *fmt就是我们的格式控制字符串后面的…是C的函数多参数即后面的参数数目不定 va_list就是char * 的typedef也就是定义了名为args的char指针 va_start(args, fmt);就是把args指向fmt后面的第一个参数的地址 这里对va_start进行解释 #define va_start(ap, A) (void) ((ap) (((char *) (A)) (_bnd (A,_AUPBND)))) va_start(ap, A) (void) ((ap) (((char *) (A)) (_bnd (A,_AUPBND))))可见ap指向的是A地址往后偏移_bnd字节而 _bnd 传参了 _ADNBND_ADNBND (sizeof (acpi_native_int) - 1) typedef s32 acpi_native_int 若采用这种宏定义表明int 类型是用32位表示也表示当前内存是4字节对齐acpi_native_int这个参数是平台相关的 所以sizeof (acpi_native_int)是当前平台的int大小我们假设是4字节那么_ADNBND就是3 #define _bnd(char,3) (13)(~3) 4#define _bnd(int,3) (43)(~3) 4#define _bnd(double,3) (43)(~3) 8我们通过上述样例可以明白**_bnd就是获取类型A的内存对齐大小**假如32位平台那么就是4的倍数 所以va_start(args, fmt) 就是把fmt偏移char*内存对齐大小个字节然后赋值给args这样args指向的就是格式字符串后面的参数 n vsprintf(sprint_buf, fmt, args);这里的n则是我们实际控制输出的字符数我们printf实际就是一个输出字符的函数n也是我们的返回值 而后面的 write(stdout, sprint_buf, n);无非就是把缓冲区里的n个字符输出到stdout输出流这就不是我们讨论的重点了 多参数实现机制原理 通过上面的剖析我们发现printf由格式控制字符串得到下一个参数的起始地址而下一个起始地址是fmt地址偏移内存对齐大小个字节 这是为什么呢 这跟函数的压栈顺序有关。我们C/C默认__cdel的从右至左将参数压栈而我们栈是向下增长的所以先入栈的地址高后入栈的地址低所以格式字符串的地址最低往上偏移自然能得到其他参数的地址 void func(int a, int b, int c) {printf(a %d located [%x]\n, a, a);printf(b %d located [%x]\n, b, b);printf(c %d located [%x]\n, c, c); } signed main() {func(1, 2, 3);return 0; } //输出 a 1 located [b3bff960] b 2 located [b3bff968] c 3 located [b3bff970]得到地址后由于我们规定格式控制字符串中%的数量即为输出参数数量然后就能拿到所有参数放到缓冲区再输出到标准输出流 如果我们想要实现多参数机制(需要了解stdarg.h)自然也要通过我们的参数设定模式类似格式控制中百分号的数量来确定参数的数目而名称出现的顺序对应参数的顺序。 可见C语言的多参数机制是很繁琐的而我们C11引入可变参数模板也正是为了追求更好的参数泛化。
http://www.pierceye.com/news/594117/

相关文章:

  • 广州市网站开发二手车网站制作贵吗
  • php网站建设模板下载用爬虫做网站
  • 岗巴网站建设宁波市住房和城乡建设局网站
  • 北京公司网站制作电话豫建市2021 42号
  • 深圳做二维码网站建设自己做的美食在哪个网站上卖
  • 论论坛坛网网站站建建设设viewjs wordpress
  • 襄阳定制型网站开发昆明网站开发推广公司
  • 做视频怎样传到网站ip域名查询
  • 天台建设局网站恒一信息深圳网站建设公司2
  • 珠海网站怎样建设网页设计相关网站
  • 网站推广服务好公司排名山西网站建设免费
  • 金乡县网站建设曲靖建设局网站
  • 唐山制作网站的公司深圳市做网站知名公司
  • 深圳方维网站建设公司全面启动门户网站建设
  • 住房和城乡建设部网站证书查询企业推广产品有什么平台好
  • 建立企业网站的目的手机排行榜软件
  • 自己做网络棋牌网站流程wordpress 自定义数据库
  • 北京网站建设厂家个人养老保险
  • 办公室门户网站建设和管理工作360排名优化工具
  • 楚天网站建设合同蜘蛛云建网站怎样
  • 建设一个小说网站企业网站 数据库设计
  • 最简单的网站开发软件有哪些ui设计外包
  • 网站主页排版重庆装修公司排名前十名
  • 网站建设得花多钱设计网站的软件
  • 辽阳企业网站建设团队网络营销与直播电商课程
  • 枣庄网站建设电话临沂广润网站建设
  • 长春市制作网站费用郑州网站专业制作
  • 婚恋网站排名前十名淘宝客网站开发一个
  • 泰国网站的域名物流公司哪家便宜又好
  • 找工作的平台seo第三方点击软件