当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>函数调用的几个概念</b>[VC/C++编程]

赞助商链接



  本文“<b>函数调用的几个概念</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

左通过栈传送,被调用的函数在返回前清理传送参数的内存栈,但差别的是函数名的修饰部份(关于函数名的修饰部份在背面将具体阐明).

_stdcall是Pascal程序的缺省调用方法,普通用于Win32 Api中,函数采取从右到左的压栈方法,自己在退出时清空仓库.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数.

2、C调用约定(即用__cdecl关键字阐明)按从右至左的次序压参数入栈,由调用者把参数弹出栈.关于传送参数的内存栈是由调用者来保护的(正因为如此,实现可变参数的函数只能利用该调用约定).别的,在函数名修饰约定方面也有所差别.

_cdecl是C和C++程序的缺省调用方法.每一个调用它的函数都包含清空仓库的代码,所以产生的可履行文件大小会比调用_stdcall函数的大.函数采取从右到左的压栈方法.VC将函数编译后会在函数名前面加上下划线前缀.是MFC缺省调用约定.

3、__fastcall调用约定是“人”如其名,它的主要特点就是快,因为它是通过存放器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前二者均差别.

_fastcall方法的函数采取存放器传送参数,VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数.  

4、thiscall仅仅利用于“C++”成员函数.this指针存放于CX存放器,参数从右到左压.thiscall不是关键词,因此不能被程序员指定.

5、naked call采取1-4的调用约按时,假如必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP存放器,退出函数时则产生代码恢复这些存放器的内容.naked call不产生这样的代码.naked call不是范例修饰符,故必须和_declspec共同利用.

关键字 __stdcall、__cdecl和__fastcall可以直接加在要输出的函数前,也可以在编译环境的Setting...\C/C++ \Code Generation项挑选.当加在输出函数前的关键字与编译环境中的挑选差别时,直接加在输出函数前的关键字有效.它们对应的号令行参数辨别为/Gz、/Gd和/Gr.缺省状况为/Gd,即__cdecl.

要完好模拟PASCAL调用约定首先必须利用__stdcall调用约定,至于函数名修饰约定,可以通过别的办法模拟.还有一个值得一提的是WINAPI宏,Windows.h支持该宏,它可以将出函数翻译成得当的调用约定,在WIN32中,它被定义为__stdcall.利用WINAPI宏可以成立自己的APIs.

2)名字修饰约定

1、修饰名(Decoration name)

“C”大概“C++”函数在内部(编译和链接)通过修饰名辨认.修饰名是编译器在编译函数定义大概原型时生成的字符串.有些情形下利用函数的修饰名是必要的,如在模块定义文件里头指定输出“C++”重载函数、构造函数、析构函数,又如在汇编代码里调用“C””或“C++”函数等.

修饰名由函数名、类名、调用约定、返回范例、参数等共同决意.

2、名字修饰约定随调用约定和编译种类(C或C++)的差别而改变.函数名修饰约定随编译种类和调用约定的差别而差别,下面辨别阐明.

a、C编译时函数名修饰约定法则:

__stdcall调用约定在输出函数名前加上一个下划线前缀,背面加上一个“@”标记和其参数的字节数,格局为_functionname@number.

__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格局为_functionname.

__fastcall调用约定在输出函数名前加上一个“@”标记,背面也是一个“@”标记和其参数的字节数,格局为number.

它们均不改变输出函数名中的字符大小写,这和PASCAL调用约定差别,PASCAL约定输出的函数名无任何修饰且全部大写.


  以上是“<b>函数调用的几个概念</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .