调用约定__stdcall / __cdecl
2015-06-29 10:32
260 查看
__cdecl与__stdcall这两种调用约定之间的主要差别在于由谁来执行对参数的清理工作。
如果是__cdecl,那么主调函数将负责执行清理工作,如果是__stdcall那被调函数将负责执行清理。
通常,我们倾向于使用__stdcall,它能够减少生成代码的规模。因为不需要每次调用时,都在返回后对esp进行操作,比如add esp, 0Ch.(抵消三个参数的大小)
__cdecl存在的意义是?支持变长数量的参数。
调用约定 参数传递 栈的清理工作 函数名修饰
stdcall 右到左 被调函数 函数名字前加"_",并且在后面增加'@'以及栈空间所需要的字节数
cdecl 右到左 主调函数 在名字前加"_"
这种函数名的规范,在编译后,比如缺少lib文件时,会看到。
通常编译器和连接器将一起来确保根据调用约定调用正确的函数。但,有时连接器不能提供这种机制,此时必须小心避免不匹配的情况。
windows API一般都会有WINAPI的前缀,表示调用约定为__stdcall
#define WINAPI __stdcall
Win32的API函数都遵循__stdcall调用约定。
在VC++开发环境中,默认的编译选项是__cdecl(C调用约定),对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall。在Windows程序中,回调函数必须遵循__stdcall调用约定,所以我们在声明回调函数时要使用CALLBACK。
如果是__cdecl,那么主调函数将负责执行清理工作,如果是__stdcall那被调函数将负责执行清理。
通常,我们倾向于使用__stdcall,它能够减少生成代码的规模。因为不需要每次调用时,都在返回后对esp进行操作,比如add esp, 0Ch.(抵消三个参数的大小)
__cdecl存在的意义是?支持变长数量的参数。
调用约定 参数传递 栈的清理工作 函数名修饰
stdcall 右到左 被调函数 函数名字前加"_",并且在后面增加'@'以及栈空间所需要的字节数
cdecl 右到左 主调函数 在名字前加"_"
这种函数名的规范,在编译后,比如缺少lib文件时,会看到。
通常编译器和连接器将一起来确保根据调用约定调用正确的函数。但,有时连接器不能提供这种机制,此时必须小心避免不匹配的情况。
windows API一般都会有WINAPI的前缀,表示调用约定为__stdcall
#define WINAPI __stdcall
Win32的API函数都遵循__stdcall调用约定。
在VC++开发环境中,默认的编译选项是__cdecl(C调用约定),对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall。在Windows程序中,回调函数必须遵循__stdcall调用约定,所以我们在声明回调函数时要使用CALLBACK。
相关文章推荐
- CodeIgniter中使用Smarty3基本配置
- win7系统怎么设置显示多个地区时间?
- Java集合框架List,Map,Set, Queue介绍
- 日经社説 20150629 「学校信仰」脱して多様な教育を探ろう
- 清除eclipse中 Launch configuration的历史记录
- 人脸图像的预处理
- java实现求可逆矩阵使用代数余子式的形式
- 黑马程序员---Java基础
- 应该专注哪一个方向?
- java通过JDBC链接SQLServer2012
- 对WEB标准以及W3C的理解与认识
- MongoDB官方文档翻译系列之 -- 执行二阶段提交
- 日经社説 20150629 食品の地理的表示をいかせ
- 如何在android的jni线程中实现回调
- JavaScript中,字符串和二进制互转
- 总结C#获取当前路径的7种方法
- 是结束也是开始
- iOS: 如何正确的绘制1像素的线
- [LeetCode] Longest Common Prefix 最长共同前缀
- 【转】Epoll详解