__stdcall、__cdecl、CALLBACK、WINAPI区别
来源:互联网 发布:网络歌手 知乎 编辑:程序博客网 时间:2024/05/29 19:21
情景一:先看下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 0
- __stdcall、__cdecl、CALLBACK、WINAPI区别
- __stdcall、__cdecl、CALLBACK、WINAPI区别
- WINAPI CALLBACK __stdcall __cdecl
- WINBASEAPI 与WINAPI(__stdcall __cdecl)的区别
- WINAPI宏、__cdecl、__stdcall、__fastcall
- __stdcall __cdecl的区别
- __stdcall __cdecl的区别
- __stdcall 与 __cdecl 区别
- __stdcall,__cdecl区别简介
- __cdecl和__stdcall区别
- __cdecl __stdcall区别
- __stdcall 与 __cdecl 区别
- __cdecl __stdcall区别
- __cdecl __stdcall区别
- __cdecl __stdcall区别
- __cdecl __stdcall区别
- __cdecl __stdcall区别
- __cdecl __stdcall区别
- 链表算法六之多项式相加
- 不错的todo建议:应该往todo-list添加什么内容
- 基于QML Pathview的大型游戏英雄联盟-预览界面
- iOS 基础函数解析 - Foundation Functions Reference
- HashMap performance improvements in Java 8
- __stdcall、__cdecl、CALLBACK、WINAPI区别
- 硬件电路的一些常识(由CS8900a学习得到) .
- Linux 系统挂载数据盘
- 到底什么是MVC?
- iOS 基础类解析 - NSData、NSMutableData
- configure: error: ZLib not installed
- 正则
- 30+ minutes - Sqrt(x)
- 走在回家的路上