<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |