cdecl、stdcall、fastcall、declspec 的用法和区别
来源:互联网 发布:无机晶体数据库下载 编辑:程序博客网 时间:2024/04/29 20:02
首先这三个修饰符是c和c++调用约定
调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的
__cdecl,__stdcal和__fastcalll都是函数调用规范,规定了参数出入栈的顺序和方法,如果只用VC
_cdecl
按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。
如函数void test(void)的修饰名是_test;对于不属于一个类的“C++”全局函数,修饰名是?test@@ZAXXZ。
这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。
_stdcall
按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。
所有的Win32 API函数都遵循该约定。
_ fastcall
是把函数参数列表的前三个参数放入寄存器eax,edx,ecx,其他参数压栈。 fastcall是BCB为了更好的兼容Delphi写的VCL而用的,delphi中的默认call是fastcall,是把函数参数列表的前三个参数放入寄存器。
举个例子,其实就是在函数声明的时候多加一个关键字,比如很多API函数就是象这样声明的:
int WINAPI MessageBoxA(HWND,LPCSTR,LPSTR,UINT);
而WINAPI实际上就是__stdcall.
大多数API都采用__stdcall调用规范,这是因为几乎所有的
__fastcall这种调用规范比较少见,但是在Borland C++ Builder中比较多的采用了这种调用方式.
如果有共享代码的
__declspec主要是用于说明DLL的引出函数的,在某些情况下用__declspec(dllexport)在DLL中生命引出函数,比用传统的DEF文件方便一些.在普通
文章出处:http://hi.baidu.com/guqiwei/blog/item/6b56f413848394075aaf53f2.html
- cdecl、stdcall、fastcall、declspec 的用法和区别
- cdecl、stdcall、fastcall、declspec 的用法和区别
- cdecl、stdcall、fastcall、declspec 的用法和区别
- cdecl、stdcall、fastcall、declspec 的用法和区别
- cdecl、stdcall、fastcall、declspec 的用法和区别
- cdecl、stdcall、fastcall、declspec 的用法和区别(转)
- cdecl、stdcall、fastcall、declspec 的用法和区别(转载自:http://hi.baidu.com/guqiwei/blog/item/6b56f413848394075aaf53f2.html)
- cdecl、stdcall、fastcall、declspec 、extern "c"
- cdecl, stdcall, pascal,fastcall的区别和调用约定
- cdecl、stdcall、fastcall函数调用约定区别
- cdecl, stdcall, pascal,fastcall 调用约定区别
- cdecl, stdcall, pascal,fastcall 调用约定区别
- cdecl、stdcall、fastcall函数调用约定区别
- cdecl, stdcall, pascal,fastcall 调用约定区别
- cdecl、stdcall、fastcall函数调用约定区别
- cdecl、stdcall、fastcall函数调用约定区别
- cdecl、stdcall、fastcall函数调用约定区别
- cdecl, stdcall, pascal,fastcall 调用约定区别
- UIViewAnimation与Core Animation的CATransition类
- 域名泛解析
- 不同浏览器放不同样式表文件
- ListView滚动背景反色问题
- Nginx虚拟目录支持PHP配置
- cdecl、stdcall、fastcall、declspec 的用法和区别
- 在一个数组中的指定位置上增加一个指定值
- Difference Between x86 And x64
- 加密解密
- 在Linux环境下面Hudson+Maven+Nexus+Android
- 关于Nginx+PHP的虚拟主机目录权限控制的探究
- JAVA经典算法33题
- 使用SQL Trace来实现SQL Server的跟踪操作
- dede 增加栏目图片字段