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

学校网站建设调查报告软件开发外包公司

学校网站建设调查报告,软件开发外包公司,东莞网页设计招聘,b2c电商平台有哪几个大家熟知的C库函数printf函数就是一个可变参数函数,它是怎么实现的呢?不过他实现是有条件的,必须函数参数的入栈顺序为从右向左的顺序,也即函数的形参,在函数调用之前,必须是最右边的参数先入栈,并且参数都…

大家熟知的C库函数printf函数就是一个可变参数函数,它是怎么实现的呢?不过他实现是有条件的,必须函数参数的入栈顺序为从右向左的顺序,也即函数的形参,在函数调用之前,必须是最右边的参数先入栈,并且参数都必须通过栈传递,以1个例子说明,如函数func(arg1, arg2,arg3),那么函数的堆栈应是:

38287304_1.jpg

ebp是帧指针寄存器,一般用来存取堆栈,有了堆栈结构,下面我们看看C可变参数的具体实现原理:

#include

enum {

ptChar,

ptInt,

ptFloat,

ptDouble,

};

void printSum(unsigned long paramFormat, ...)

{

/*高16位为可变参数类型,低16位为可变参数个数*/

int paramType = (paramFormat >> 16);

int paramNum = paramFormat & 0xffff;

/*?mFormat = ebp 8,第一个参数的地址*/

unsigned long *pArg = ?mFormat;

/*ebp 0x0c, 第二个参数地址*/

pArg ;

switch(paramType)

{

case ptChar:

{

int sum = 0;

for (int i = 0; i < paramNum; i )

{

char *pValue = (char *)pArg;

sum = *pValue;

pArg ;

}

printf("%d\n", sum);

}

break;

case ptInt:

{

int sum = 0;

for (int i = 0; i < paramNum; i )

{

int *pValue = (int *)pArg;

sum = *pValue;

pArg ;

}

printf("%d\n", sum);

}

break;

case ptFloat:

{

float sum = 0;

/**/

pArg ;

/*浮点参数,堆栈占8个字节,所以指针偏移为8*/

for (int i = 0; i < paramNum; i )

{

float *pValue = (float *)pArg;

sum = *pValue;

pArg ;

pArg ;

}

printf("%f\n", sum);

}

break;

case ptDouble:

{

double sum = 0;

/*双精度浮点参数,堆栈占8个字节,所以指针偏移为8*/

for (int i = 0; i < paramNum; i )

{

double *pValue = (double *)pArg;

sum = *pValue;

pArg ;

pArg ;

}

printf("%f\n", sum);

}

break;

default:

printf("unknowned type!\n");

break;

}

}

void main()

{

unsigned long paramFormat = 3;

char a = 1, b = 2, c = 3;

printSum(paramFormat, a, b, c);

paramFormat = ptInt << 16;

paramFormat = 3;

int ia = 1, ib = 2, ic = 3;

printSum(paramFormat, ia, ib, ic);

paramFormat = ptFloat << 16;

paramFormat = 3;

float fa = 1, fb = 2, fc = 3;

printSum(paramFormat, fa, fb, fc);

paramFormat = ptDouble << 16;

paramFormat = 3;

double da = 1, db = 2, dc = 3;

printSum(paramFormat, da, db, dc);

}

上面这种方法对函数参数的入栈顺序有限制,必须从右向左入栈,这就是为什么pascal调用方式不能实现printf的原因,并且函数形参都要通过栈来传递,这对有些编译器为了优化处理,函数参数通过寄存器来传递,从而不满足要求。鉴于次,本文采用C 的默认形参实现可变参数的方法,没有上面的这些限制,下面是实现代码:

#include

enum {

ptChar,

ptInt,

ptFloat,

ptDouble,

};

void printSum(unsigned long paramType,

void *arg1 = NULL,

void *arg2 = NULL,

void *arg3 = NULL,

void *arg4 = NULL,

void *arg5 = NULL,

void *arg6 = NULL,

void *arg7 = NULL,

void *arg8 = NULL,

void *arg9 = NULL,

void *arg10 = NULL)

{

void *arg[10] = {

arg1,

arg2,

arg3,

arg4,

arg5,

arg6,

arg7,

arg8,

arg9,

arg10,

};

switch(paramType)

{

case ptChar:

{

int sum = 0;

for (int i = 0; i < 10; i )

{

if (arg[i] != NULL)

{

char *pValue = (char *)arg[i];

sum = *pValue;

}

else

break;

}

printf("%d\n", sum);

}

break;

case ptInt:

{

int sum = 0;

for (int i = 0; i < 10; i )

{

if (arg[i] != NULL)

{

int *pValue = (int *)arg[i];

sum = *pValue;

}

else

break;

}

printf("%d\n", sum);

}

break;

case ptFloat:

{

float sum = 0;

for (int i = 0; i < 10; i )

{

if (arg[i] != NULL)

{

float *pValue = (float *)arg[i];

sum = *pValue;

}

else

break;

}

printf("%f\n", sum);

}

break;

case ptDouble:

{

double sum = 0;

for (int i = 0; i < 10; i )

{

if (arg[i] != NULL)

{

double *pValue = (double *)arg[i];

sum = *pValue;

}

else

break;

}

printf("%f\n", sum);

}

break;

default:

printf("unknowned type!\n");

break;

}

}

void main()

{

unsigned long paramType = ptChar;

char a = 1, b = 2, c = 3;

printSum(paramType, &a, &b, &c);

paramType = ptInt;

int ia = 1, ib = 2, ic = 3;

printSum(paramType, &ia, &ib, &ic);

paramType = ptFloat;

float fa = 1, fb = 2, fc = 3;

printSum(paramType, &fa, &fb, &fc);

paramType = ptDouble;

double da = 1, db = 2, dc = 3;

printSum(paramType, &da, &db, &dc);

}

http://www.lbrq.cn/news/2554813.html

相关文章:

  • 无锡商城网站建设哈尔滨网络推广
  • app拉新渠道南宁seo营销推广
  • 做动态网站学php_asp+还是jsp好?武汉网站搜索引擎优化
  • 清远网站建设推广关键词排名点击软件推荐
  • 面包类网站设计成都网站设计
  • 可以自己做视频网站吗拼多多商品关键词搜索排名
  • 怎么买域名自己做网站营销团队找产品合作
  • 网站文章更新做销售找客户渠道
  • 昆明网站开发哪家好网站定制
  • 上海松江区做网站的公司成都百度seo优化公司
  • 对省政府网站建设的发展有期待seo快速推广
  • 平顶山公司做网站seo关键词优化系统
  • 网站开发团队介绍谷歌商店下载官网
  • 品划做网站广告公司广告牌制作
  • 常德市人民政府网站今日最新闻
  • 律师网站深圳网站设计关键词热度分析工具
  • 河南映天建设网站关键词优化技巧
  • 网站建设综合推荐指数网站
  • 做网站咋不用买虚拟机网址和网站的区别
  • 海南专业网站建设seo的排名机制
  • 做网站服务器需要系统关键词生成器 在线
  • 网站建设差打不开疫情防控最新通告
  • 重庆百度网站快速排名怎么样推广自己的产品
  • 高端企业门户网站建设服务公司外贸营销推广
  • 做视频网站视频存放问题企业培训计划方案
  • 榆林公司做网站外链发布
  • 有没有发布需求的网站网络营销公司招聘
  • 河南省建设监理协会网站重庆做网络优化公司电话
  • 想做棋牌网站怎么做google下载安卓版下载
  • wordpress归档侧边栏按分类长沙做优化的公司
  • 前端图片懒加载的深度指南:从理论到实战
  • c#中switch case语句的用法
  • 数据结构与算法:队列的表示和操作的实现
  • Spring boot 打包成docker image 镜像
  • 2024 年 NOI 最后一题题解
  • k8s搭建nfs共享存储