C++杂记005:调用约定详解

阅读量: 鲁文奎 2021-04-23 11:16:53
Categories: Tags:

[toc]

调用约定介绍

VC中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟 Windows API 保持一致,建议使用 __stdcall 方式。

C/C++ 函数调用约定:

常用的调用方式如下:

详细介绍几种调用方式:

  1. __stdcall
    是C++的标准调用方式, 语法声明:
	int __stdcall function(int a, int b);

a. 参数【从右向左】依次压入堆栈
b. 由被调用函数自己来恢复堆栈, 称为自动清栈
c. 函数名自动加前导下划线, 后面紧跟一个@, 其后跟着参数的大小

  1. cdecl
    是C调用方式, 是C语言缺省的调用方式, 语法声明:
	int functhion(int a, int b) // 不加修饰符就是C调用方式
	int __cdecl function(int a , int b) // 明确指定C调用方式

a. 参数【从右到左】一次压入堆栈
b. 由调用者恢复堆栈, 称为手动清栈
c. 函数名自动加前导下划线

  1. fastcall
    一种快速调用方式, 通过CPU寄存器传递参数。使用此方式的函数的第一个和第二个DWORD参数通过ecx和edx传递, 后面参数从右到左依次入栈。由被调用函数清理堆栈。
    声明语法:
    int fastcall function(int a, int b);

  2. thiscall
    是唯一一种不能显示指定的修饰符。是C++类成员函数缺省的调用方式。由于成员函数调用还有一个this指针, 因此必须用这种特殊的调用方式
    a. 参数【从右向左】一次入栈
    b. 参数个数确定, this指针通过ecx传递给被调用者;参数个数不确定, this指针最后入栈。
    c. 参数个数确定, 由调用者清理堆栈, 否则由函数自己自己清理堆栈.
    */

C++ 中 __declspec 的用法
M$ 参考资料: https://docs.microsoft.com/en-us/cpp/cpp/declspec?view=msvc-160
github 参考资料: https://gist.github.com/4u1kto/92f03e0d2f766b9e9ac7