关于函数调用方式`__stdcall`和`__cdecl`
来源:互联网 发布:centos官方网站 编辑:程序博客网 时间:2024/04/30 14:16
关于函数调用方式__stdcall
和__cdecl
- 关于函数调用方式__stdcall和__cdecl
- __stdcall
- __cdecl
- 两者的相同点与不同点
- 实例
__stdcall
__stdcall
的全称是standard call。是C++的标准调用方式。
函数参数的入栈顺序为从右到左入栈。函数返回时使用retn x
指令,其中x
为调整堆栈的字节数。这种方式叫做自动清栈。即被调用的函数的参数个数是固定的,调用者必须严格按照定义传递参数,一个不多,一个不少。
__cdecl
__cdecl
的全称是C Declaration
,即C语言默认的函数调用方式。
函数参数的入栈顺序为从右到左入栈。函数返回时作用ret
指令。由调用者手动清栈。被调用的函数支持可变参数。调用者根据调用时传入参数的个数,手动平衡堆栈。
两者的相同点与不同点
- 相同点
- 参数入栈顺序相同:从右到左
- 不同点
- 堆栈平衡方式不同:
__stdcall
自动清栈,__cdecl
手动清栈。 - 返回指令不同:
_stdcall
使用retn x
,__cdecl
使用ret
- 编译后函数的修饰名不同: 假设有函数int foo(int a, int b), 采用
__stdcall
编译后的函数名为_foo@8
,而采用__cdecl
编译后的函数名为_foo
。
- 堆栈平衡方式不同:
实例
- 支持可变参数的函数必须定义为
__cdecl
,如:int printf(char *fmt, ...);
在
windef.h
中对__stdcall
和__cdecl
的定义#define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall #define cdecl _cdecl #ifndef CDECL #define CDECL _cdecl #endif
0 0
- 关于函数调用方式`__stdcall`和`__cdecl`
- 函数调用方式“__stdcall”,"__cdecl"
- 关于__stdcall和__cdecl调用方式的理解
- 关于__stdcall和__cdecl调用方式的理解
- 关于__stdcall和__cdecl调用方式的理解
- 关于__stdcall和__cdecl调用方式的理解
- 关于__stdcall和__cdecl调用方式的理解
- 有关__cdecl和__stdcall调用方式
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- 关于__stdcall和__cdecl
- 函数调用方式的区别[thiscall,__cdecl,__stdcall]
- html5的网页在MAC及ipad上按钮无法正常切换的处理
- 2016太原网络营销师sem(百度竞价)账户搭建问题解剖?
- 悲观锁及乐观锁的引用
- spark下使用submit提交任务后报jar包已存在错误
- hdu2028 Lowest Common Multiple Plus
- 关于函数调用方式`__stdcall`和`__cdecl`
- 【炼数成金-推荐系统笔记】
- LeetCode 203. Remove Linked List Elements 解题报告
- 基本语句的综合运用
- solr-4.10.4环境搭建+导入数据库+中文分词
- Mac OS X Yosemite 10.10.5使用Toolbox安装Docker
- 记录心情——机房重构的开始
- 程序加载中,请稍后...progressDialog的使用
- 【ZOJ】1586 - QS Network(克鲁斯塔尔)