printf函数的实现原理
成都创新互联是专业的枣强网站建设公司,枣强接单;提供成都做网站、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行枣强网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下面,结构上看起来是第一个,所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。
_CRTIMP __checkReturn_opt int __cdecl printf(__in_z __format_string const char * _Format, ...); 最后的三个点...就是可以输入多个参数的,自己写的函数也是可以接受多个参数的。
然后在函数中使用va_start、va_end、va_list来接受多个参数自己实现一个printf也不难,遵循_cdecl约定即可,printf就根据%的个数来确定参数个数.简单解释下将用到的3个宏va_list其实只是char*指针而已va_start(ap,arg);一个参数是va_list变量,arg是第一个参数,指向第一个可变参数.其实现简易理解为ap=&format+sizeof(arg)va_arg(ap,type),第一个参数是va_list变量,第二个参数是可变参数类型其功能:返回当前ap指向的类型变量,并且指向下一个变量*((type*)(ap+=sizeof(type)-sizeof(type));
size_t __cdecl strlen(const char *); typedef unsigned int size_t; 根据这两个申明 可以知道,strlen()函数的返回值类型是 UINT 无符号整型,范围0-42亿
到此,以上就是小编对于的问题就介绍到这了,希望这4点解答对大家有用。
新闻名称:printf原理?(__cdecl只在windows上用吗)
分享路径:http://www.shufengxianlan.com/qtweb/news6/2956.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联