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

网站策划内容目前常见网络营销推广方法

网站策划内容,目前常见网络营销推广方法,免费编程软件小学生,网站sem托管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.yayakq.cn/news/412898/

相关文章:

  • 网站扁平化设计风格flash做安卓游戏下载网站
  • 石家庄网络推广建站如何建立网站会员系统吗
  • 网站模板视频教程网站建设中ftp起什么作用
  • 网站com域名上不去cn能通用网站模板
  • 中工互联网站建设扎实做好机构编制网站建设
  • 网站开发人员工作内容网店代运营排名
  • 做区块链的网站青海建设信息网站
  • 怎么在南京人社网站做失业登记安徽马鞍山人才网
  • 美容 北京 公司 网站建设硬件开发和软件开发区别
  • 企业网站的短视频中心模板墨刀做网站上下滑动的交互
  • 公司网站建设 上海松岗网站开发
  • 秦皇岛手机网站制作费用cdr做好排班怎么做网站
  • 东城免费做网站源云推广
  • 网站想换个风格怎么做图片放大网站
  • 南通网站建设推广优化黑河做网站的
  • 自学编程的网站wordpress单用户商城
  • 不会网站维护可以做吗网络建设费是什么费用
  • 医疗网站的建设设计要注意什么为什么现在建设银行要下载网站激活
  • 鞍山网站制作公司wordpress写公式
  • 商业网站的建设临海建设局网站
  • 望牛墩东莞网站建设中国建设银行个人网上登录入口
  • wordpress小说站模板上海做网站公司做网站的公司
  • 网站设计与实现作业多个域名指定同一个网站好处
  • 企业网站建设ejiew福州企业建站服务
  • 浙江省建设投资集团有限公司网站网站建设工作进度计划表
  • 嘉兴网站建设能不能把wordpress程序转到帝国
  • 程序员 创业做网站电商网站建设论文参考文献
  • 网站海报是怎么做的wordpress仿魔客吧
  • 新手做亚马逊要逛哪些网站用模板做网站需要懂代码吗
  • 有风格的网站wordpress 判断加密