CC++函数调用的方式有哪些_第1页
CC++函数调用的方式有哪些_第2页
CC++函数调用的方式有哪些_第3页
CC++函数调用的方式有哪些_第4页
CC++函数调用的方式有哪些_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、cc+函数调用的方式有哪些c/c+函数调用的方式有哪些栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。 栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以 在栈顶上方向栈中加入数据,这个操作被称为压栈(push),压栈以 后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用 户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下 的一个元素变成栈顶,栈顶指针随之修改。函数调用时,调用者依 次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数 据,并进行计算。函数计算结束以后,或者调用者,或者函数本身 修改堆栈,使堆栈恢复原装。在参数传递中,有两个重要的

2、问题必须要明确说明:1 .当参数个数多于一个时,按照什么顺序把参数压入堆栈;2 .函数调用后,由谁来把堆栈恢复原状。在高级语言中,就是通过函数的调用方式来说明这两个问题的。 常见的调用方式有:stdcallcdeclfastcallthiscallthiscallnakedcall下面就分别介绍这几种调用方式:1.stdcallstdcall调用方式又被称为pascal调用方式。在microsoftc+ 系列的c/c+编译器中,使用pascal宏,winapi宏和callback宏 来指定函数的调用方式为stdcallostdcall调用方式的, 函数声明为:int_stdcallfuncti

3、on(inta, intb);stdcall的调用方式意味着:(1)参数从右向左一次压入堆栈(2)由被调用函数自己来恢复堆栈(3)函数名自动加前导下划线,后面紧跟着一个,其后紧跟着参 数的尺寸上而那个函数翻译成汇编语言将变成:pushb先压入第二个参数pusha再压入第一个参数callfunction调用函数在编译时,此函数的名字被翻译为_function82. cdeclintfunction(inta, intb)不加修饰符就是c调用方式int_cdeclfunction(inta, intb)明确指定用 c 调用方式cdecl的调用方式决定了:(1)参数从右向左依次压入堆栈(2)由调用者

4、恢复堆栈(3)函数名自动加前导下划线由于是由调用者来恢复堆栈,因此c调用方式允许函数的参数个 数是不固定的,这是c语言的一大特色。此方式的函数被翻译为:pushb 先压入第二个参数pusha 在压入第一个参数callfuntion 调用函数addesp, 8清理堆栈在编译时,此方式的函数被翻译成:function3. fastcallfastcall按照名字上理解就可以知道,它是一种快速调用方式。 此方式的函数的第一个和第二个dword参数通过ecx和edx传递,后而的参数从右向左的顺序压入栈。被调用函数清理堆栈。函数名修个规则同stdcall其声明语法为:intfastcallfunctio

5、n(inta, intb);4. thiscallthiscall调用方式是唯一一种不能显示指定的修饰符。它是c+ 类成员函数缺省的调用方式。由于成员函数调用还有一个this指针, 因此必须用这种特殊的调用方式。thiscall调用方式意味着:参数从右向左压入栈。如果参数个数确定,this指针通过ecx传递给被调用者;如果参 数个数不确定,this指针在所有参数压入栈后被压入栈。参数个数不定的,由调用者清理堆栈,否则由函数自己清理堆栈。可以看到,对于参数个数固定的情况,它类似于stdcall,不定 时则类似于cdecl。5. nakedcall是一种比较少见的调用方式,一般高级程序设计语言中不

6、常见。函数的声明调用方式和实际调用方式必须一致,必然编译器会产 生混乱。函数名字修改规则:1. c编译时函数名修饰约定规则:_stdcall调用约定在输出函数名前加上一个下划线前缀,后面 加上一个“”符号和其参数的字节数,格式为_function8。_cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式 为function。_fastcall调用约定在输出函数名前加上一个“十 符号,后面 也是一个符号和其参数的字节数,格式为function8。它们均不改变输出函数名中的字符大小写,这和pascal调用约 定不同,pascal约定输出的函数名无任何修饰且全部大写。2. c+编译时函数名修饰

7、约定规则:stdcall调用约定:(1)以“?”标识函数名的开始,后跟函数名;(2)函数名后面以“yg”标识参数表的开始,后跟参数表;(3)参数表以代号表示:x-void,dchar,e-unsignedchar,f-short,hint,i-unsignedintj-long,k-unsignedlong,m一float,n-double,_n-bool.pa一表示指针,后面的代号表明指针类型,如果相同类型的指针 连续出现,以“0”代替,一个“0”代表一次重复;(4)参数表的第一项为该函数的返回值类型,其后依次为参数的 数据类型,指针标识在其所指数据类型前;(5)参数表后以“z”标识整个名字的结束,如果该函数无参数, 则以“z”标识结束。inttestl(charivari, unsignedlong)?testlyghpadkz”voidtest2() “?test2ygxxz”cdecl调用约定:规则同上面的_stdcall调用约

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论