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

.ent做的网站有哪些seo营销服务

.ent做的网站有哪些,seo营销服务,b2b网站开发客户,中国万网注册网站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://www.tj-hxxt.cn/news/9615.html

相关文章:

  • app网站模板西地那非能提高硬度吗
  • 怎么用mvc架构做网站全媒体广告代理加盟
  • 河南简介网站设计朝阳网络推广
  • 浙江省住房和城乡建设行业网站seo咨询服务价格
  • php做彩票网站网店运营推广登录入口
  • 怎么看公司网站做的好不好哦seo课程排行榜
  • 个人名义做网站能备案吗app开发网站
  • 怎么做淘宝卷网站泉州seo
  • 高大上网站设计成都最新消息今天
  • wordpress capability manager优化网络培训
  • 兰州做网站哪家专业php免费开源crm系统
  • 白佛网站建设做网站的外包公司
  • 青岛大型门户网站建设推广百度推广图片
  • 泸州网站公司楚雄今日头条新闻
  • 网站开发开发语言百度帐号申请注册
  • 中铁建设集团有限公司门户网站整合网络营销是什么
  • 国际交友网站做英文客服百度竞价一个月5000够吗
  • 下载wordpress建站程序seo网站地图
  • 免费网站制作软件的app疫情防控最新信息
  • 专门做qq小工具的网站想做推广哪个平台好
  • 怎么将自己房子投入网站做民宿数据分析一般用什么软件
  • 广州网站建设优化百度搜索推广方案
  • 北海做网站注册城乡规划师教材
  • 注册公司在哪个网站注册南京seo建站
  • 崔凯 本地wordpress昆明seo外包
  • 乐清网站建设服务域名注册需要多久
  • 做的网站为什么图片看不了怎么样做推广
  • 网站建设的业务流程图优质友情链接
  • 上海专业网站建设网络营销学院
  • 2017网站建设有市场吗网络营销课程学什么