首页 > 代码库 > __stdcall、__cdecl、CALLBACK、WINAPI区别

__stdcall、__cdecl、CALLBACK、WINAPI区别

情景一:先看下Windows开发下的使用:

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
这里就有一个CALLBACK,转到定义看一下
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
...

从上面也可以看到在windows平台下WINAPI和CALLBCAK其实是一致的;

情景二:另外我们知道在使用dumpbin DLL符号名的时候,假设有个add函数,输出时会如?add@@YANHH@Z之类的,如果加上extern ”C“之类的字符,输出的函数符号就是之前定义的add函数名了,这里就牵涉到函数调用问题,因为不同的语言和编译器平台,约定不一样,比如说函数的形参,默认采用的是压入栈中,有些是从左往右压入,有些则是从右往左压入的,不同的标准是不一样,所以如果调用就会出现出错,必须要指明哪一种调用方式,以便编译器能够正确识别。

那么他们有什么区别呢?

1)首先说下,C调用标准采用的是__cdecl,采用的入栈顺序,。。。

      而Delphi采用的是pascal调用标准,即标准约定stdcall,也是Windows默认使用的约定,也就是说在Windows平台下WINAPI、CALLBCAK、stdcall其实都是一致的

2)__stdcall与__cdecl是两种不同的调用约定,定义了函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈,以及产生函数修饰名的方法

3)在Windows程序中,回调函数必须遵从__stdcall调用约定,所以使用的是CALLBACK,当然也可以直接使用__stdcall,主要是便于区分

注意:有关入栈顺序,记得前面在看嵌入式方面的书籍中有关压入栈的顺序讲解较多,主要他们使用汇编,必须将具体的参数压入有关寄存器,然后取指的时候可以一一对应,回头查找一下,再做深入的解释