首页 > 代码库 > C++技术问题总结-第13篇 调用约定有哪些,有什么不同

C++技术问题总结-第13篇 调用约定有哪些,有什么不同

调用约定(Calling convention),决定以下内容:

a. 函数参数的压栈顺序。

b. 由调用者还是被调用者把参数弹出栈。

c. 以及产生函数修饰名的方法。

 

常用的调用约定为__stdcall__cdecl__fastcall

1) __stdcall

StandardCall的缩写,约定内容:

a. 参数从右向左压入堆栈。

b. 函数被调用者修改堆栈。

c. 输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数,格式为_functionname@number,例如 :function(int a, int b),其修饰名为:_function@8

 

通常用于Win32 Api主要见于Microsoft Visual CC++

对应宏定义:#define WINAPI __stdcall

 

2) __cdecl

C Declaration的缩写,约定内容:

a. 参数从右到左入栈。

b. 调用者清除栈,俗称手动清栈。

c. 输出函数名前加上一个下划线前缀,格式为_functionname

 

__cdeclC/C++语言默认的函数调用方法。

 

3) __fastcall

为了提高调用速度,将前两个(或若干个)参数由寄存器传递,其余参数还是通过堆栈传递。

快速调用,约定内容:

a. 参数从右向左压入堆栈。

b. 函数被调用者修改堆栈。

c. 输出函数名前加上一个"@"符号,后面也是一个"@"符号和其参数的字节数,格式为@functionname@number

 

不同编译器编译的程序规定的寄存器不同。在Intel x86平台上,使用ECXEDX寄存器。使用__fastcall方式无法用作跨编译器的接口。

C++技术问题总结-第13篇 调用约定有哪些,有什么不同