[toc]
调用约定介绍
VC中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟 Windows API 保持一致,建议使用 __stdcall 方式。
C/C++ 函数调用约定:
- 参数入栈顺序
- 谁负责清理堆栈
常用的调用方式如下:
- C 语言: __cdecl、__stdcall、__fastcall、naked、__pascal
- C++ 语言: __cdecl、__stdcall、__fastcall、naked、__pascal、__thiscall
详细介绍几种调用方式:
- __stdcall
是C++的标准调用方式, 语法声明:
int __stdcall function(int a, int b);
a. 参数【从右向左】依次压入堆栈
b. 由被调用函数自己来恢复堆栈, 称为自动清栈
c. 函数名自动加前导下划线, 后面紧跟一个@, 其后跟着参数的大小
- cdecl
是C调用方式, 是C语言缺省的调用方式, 语法声明:
int functhion(int a, int b) // 不加修饰符就是C调用方式
int __cdecl function(int a , int b) // 明确指定C调用方式
a. 参数【从右到左】一次压入堆栈
b. 由调用者恢复堆栈, 称为手动清栈
c. 函数名自动加前导下划线
-
fastcall
一种快速调用方式, 通过CPU寄存器传递参数。使用此方式的函数的第一个和第二个DWORD参数通过ecx和edx传递, 后面参数从右到左依次入栈。由被调用函数清理堆栈。
声明语法:
int fastcall function(int a, int b); -
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