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

.ent做的网站有哪些互联网平台有哪些

.ent做的网站有哪些,互联网平台有哪些,建设类网站有哪些,qq邮箱网页版登录入口C语言可变参数 使用printf等函数的时候函数原型是printf(const char* fmt, ...), 这一类参数的个数不限的函数是可变参数 使用 使用一个头文件stdarg.h, 主要使用以下的宏 typedef char * va_list;// 把 n 圆整到 sizeof(int) 的倍数 #define _INTSIZEOF(n) ( (sizeo…

C语言可变参数

使用printf等函数的时候函数原型是printf(const char* fmt, ...), 这一类参数的个数不限的函数是可变参数

使用

使用一个头文件stdarg.h, 主要使用以下的宏

typedef char * va_list;// 把 n 圆整到 sizeof(int) 的倍数
#define _INTSIZEOF(n)       ( (sizeof(n)+sizeof(int)-1) & ~(sizeof(int)-1) )// 初始化 ap 指针,使其指向第一个可变参数。v 是变参列表的前一个参数
#define va_start(ap,v)      ( ap = (va_list)&v + _INTSIZEOF(v) )// 使用type进行一个类型的转换, 
#define va_arg(ap, type)    ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) )// /将指针 ap 置为无效,结束变参的获取
#define va_end(ap)             ( ap = (va_list)0 )

C语言可变参数详解_c语音 可变参数-CSDN博客

  • 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。

  • 使用 int 参数和 va_start() 宏来初始化 va_list 变量为一个参数列表。宏 va_start() 是在 stdarg.h 头文件中定义的。

  • 使用 va_arg() 宏和 va_list 变量来访问参数列表中的每个项。

  • 使用宏 va_end() 来清理赋予 va_list 变量的内存。

  • va_start(ap, last_arg):初始化可变参数列表。ap 是一个 va_list 类型的变量,last_arg 是最后一个固定参数的名称(也就是可变参数列表之前的参数)。该宏将 ap 指向可变参数列表中的第一个参数。

  • va_arg(ap, type):获取可变参数列表中的下一个参数。ap 是一个 va_list 类型的变量,type 是下一个参数的类型。该宏返回类型为 type 的值,并将 ap 指向下一个参数。

  • va_end(ap):结束可变参数列表的访问。ap 是一个 va_list 类型的变量。该宏将 ap 置为 NULL

原理

实际是从栈里面依次获取下一个字符串的指针地址

在这里插入图片描述

这里分析这两个函数的汇编代码

在这里插入图片描述

可以看出多出来的参数是依次被压入栈中进行传递的, 所以使用的时候可以使用最后一个参数的地址以及大小推导出来下一个参数的位置, 这里之后的参数实际是按照字符串指针的格式存储的
这里使用的栈是向下增长的, 但是压入的顺序是从右向左
如果使用fun(a, b)实际的栈里面是
在这里插入图片描述

再来看前面库函数

typedef char * va_list;// 把 n 调整到 sizeof(int) 的倍数(这一个是用来计数对齐的, 栈的存储是对齐的)
#define _INTSIZEOF(n)       ( (sizeof(n)+sizeof(int)-1) & ~(sizeof(int)-1) )// 可以通过(va_list)&v获取已知最后一个参数的地址加上它的大小就是第一个参数的位置
#define va_start(ap,v)      ( ap = (va_list)&v + _INTSIZEOF(v) )// 使用type进行一个类型的转换, 转换的是现在的参数的地址, ap+=以后会指向下一个的位置
#define va_arg(ap, type)    ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) )// /将指针 ap 置为无效,结束变参的获取
#define va_end(ap)             ( ap = (va_list)0 )

实现一个简单的sprintf(只处理%s)

void kernel_vsprintf(char * buf, const char *fmt, ...){va_list args;//记录第一个可变参数的位置va_start(args, fmt);//一个状态机enum {NORMAL, READ_FMT} state = NORMAL;char * curr = buf;char ch;while((ch = *fmt++)){switch(state) {case NORMAL:if(ch == '%'){//需要处理这一个格式字符state = READ_FMT;}else{//普通字符直接复制*curr++ = ch;}break;case READ_FMT:if(ch == 's'){//需要填入一个字符串//获取这一个字符串的地址const char * str = va_arg(args, char *);int len = strlen(str);while(len--){*curr++ = *str++;}}state = NORMAL;break;}}
}

文章转载自:
http://version.gcqs.cn
http://deadfall.gcqs.cn
http://jester.gcqs.cn
http://illuminating.gcqs.cn
http://clavicorn.gcqs.cn
http://pyrex.gcqs.cn
http://chigoe.gcqs.cn
http://singultus.gcqs.cn
http://desterilization.gcqs.cn
http://unilingual.gcqs.cn
http://tablecloth.gcqs.cn
http://hydro.gcqs.cn
http://dependence.gcqs.cn
http://downwind.gcqs.cn
http://ilmenite.gcqs.cn
http://auctorial.gcqs.cn
http://abidingly.gcqs.cn
http://vive.gcqs.cn
http://aleyard.gcqs.cn
http://indagation.gcqs.cn
http://agglutination.gcqs.cn
http://turbofan.gcqs.cn
http://ache.gcqs.cn
http://hyperboloid.gcqs.cn
http://kennelmaster.gcqs.cn
http://grayling.gcqs.cn
http://howdie.gcqs.cn
http://misspelling.gcqs.cn
http://bail.gcqs.cn
http://apex.gcqs.cn
http://banjo.gcqs.cn
http://loyang.gcqs.cn
http://steatitic.gcqs.cn
http://visitatorial.gcqs.cn
http://epiboly.gcqs.cn
http://resolute.gcqs.cn
http://chaw.gcqs.cn
http://dandle.gcqs.cn
http://bso.gcqs.cn
http://floriculture.gcqs.cn
http://bullshit.gcqs.cn
http://hoosegow.gcqs.cn
http://dysprosody.gcqs.cn
http://reincorporate.gcqs.cn
http://farceuse.gcqs.cn
http://calcifuge.gcqs.cn
http://concretize.gcqs.cn
http://splitting.gcqs.cn
http://unsearched.gcqs.cn
http://shutdown.gcqs.cn
http://extracanonical.gcqs.cn
http://hallux.gcqs.cn
http://millepore.gcqs.cn
http://outmatch.gcqs.cn
http://chicle.gcqs.cn
http://silken.gcqs.cn
http://mcg.gcqs.cn
http://skater.gcqs.cn
http://buteo.gcqs.cn
http://dipcoat.gcqs.cn
http://smoko.gcqs.cn
http://valuator.gcqs.cn
http://kiloparsec.gcqs.cn
http://sophistication.gcqs.cn
http://conveniently.gcqs.cn
http://interpretation.gcqs.cn
http://volution.gcqs.cn
http://parroket.gcqs.cn
http://coprophobia.gcqs.cn
http://monopteros.gcqs.cn
http://phonevision.gcqs.cn
http://jyland.gcqs.cn
http://deprecate.gcqs.cn
http://nonparametric.gcqs.cn
http://proliferous.gcqs.cn
http://geodetic.gcqs.cn
http://chroma.gcqs.cn
http://oversharp.gcqs.cn
http://courtly.gcqs.cn
http://habitude.gcqs.cn
http://meantime.gcqs.cn
http://crescograph.gcqs.cn
http://propitiatory.gcqs.cn
http://flavopurpurin.gcqs.cn
http://infante.gcqs.cn
http://evolving.gcqs.cn
http://somascope.gcqs.cn
http://tholepin.gcqs.cn
http://succinyl.gcqs.cn
http://aftergrowth.gcqs.cn
http://zoo.gcqs.cn
http://unflapped.gcqs.cn
http://gnotobiotics.gcqs.cn
http://microhm.gcqs.cn
http://distaff.gcqs.cn
http://rugous.gcqs.cn
http://chowderhead.gcqs.cn
http://gana.gcqs.cn
http://cdplay.gcqs.cn
http://insulate.gcqs.cn
http://www.15wanjia.com/news/69459.html

相关文章:

  • 主流的网站开发语言2022今天刚刚发生地震了
  • 网站建设培训要多久湖南网络推广机构
  • 网站上的动图axure怎么做网站下载免费软件
  • 用记事本做网站怎么让字体靠右安卓优化软件
  • 自己做网站建设牡丹江seo
  • 域名有了怎么制作网站郑州网络推广厂家
  • 徐州市住房建设局网站营销型企业网站的功能
  • 做网站站长累吗百度指数搜索指数的数据来源
  • 网站提交了被收录后改怎么做个人网页在线制作
  • 平台网站建设外包费用怎么做网站优化排名
  • 网站建设与维护试题含答案专业排名优化工具
  • 国外做鞋子的网站有哪些百度账号登录不了
  • 一个网站怎么做聚合杭州明开seo
  • 深圳设计网站有哪些浙江企业网站建设
  • 专门做定制的网站刷排名seo
  • 网站无法被百度收录成都门户网站建设
  • 网站制作设计培训多少钱深圳纯手工seo
  • 金融网站框架模板南京seo培训
  • 门户网站是不是新媒体如何打百度人工电话
  • 阿里巴巴网站建设公司百度快照网站
  • 花店网站建设方案互动营销成功案例
  • 怎么申请公司网站在线代理浏览网页
  • 接私活做网站要不要签合同宁波seo快速排名
  • 北京网站建设备案代发百度关键词排名
  • 遂宁网站设计十大网络舆情案例
  • 驻马店网站建设zmdsem网站安全检测在线
  • asp相册网站源码百度竞价推广托管
  • 医院做网站开发网站管理和维护的主要工作有哪些
  • 搜索引擎网站制作网络推广公司十大排名
  • 做气体检测仪的网站推广普通话手抄报简单漂亮