我们最常用的调用约定有以下 2 种, __cdecl 和 __stdcall, __cdecl 是 c/c++ 的默认调用约定 (calling convention), __stdcall 是 windows api 函数的调用约定。这 2 种调用约定的参数传递方式是一样的, 都是从右至左; 在堆栈的维护方式上, __cdecl 要求调用者清除堆栈, 而 __stdcall 由被调用函数自己清除堆栈;名称修饰上, __cdecl 直接在原有的函数名称上加一个下划线 _ ,而 __stdcall 方式不仅加下划线而且还在后面加一个 “@ 参数占用字节数 ” ,具体如何,请看下面的例子。
#include <stdio.h>
int __cdecl funcA(int a, int b);
int __stdcall funcB(int a, int b);
int main()
{
int a, b, c, d;
a = 3;
b = 4;
c = funcA(a, b);
d = funcB(a, b);
return 0;
}
int __cdecl funcA(int a, int b)
{
return a + b;
}
int __stdcall funcB(int a, int b)
{
return a + b;
}