__stdcall、__cdecl、CALLBACK、WINAPI区别
时间:2014-05-02 23:04:49
收藏:0
阅读:411
情景一:先看下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,主要是便于区分
注意:有关入栈顺序,记得前面在看嵌入式方面的书籍中有关压入栈的顺序讲解较多,主要他们使用汇编,必须将具体的参数压入有关寄存器,然后取指的时候可以一一对应,回头查找一下,再做深入的解释
评论(0)