调用约定

调用约定:

1. 参数的顺序

2.参数存放位置

3.返回值存放位置

4.参数释放

5.函数调用中,用什么约定由被调方决定,在不写约定的时候默认是_cdecl (C调用约定)

(默认的调用方式可以在IDE环境中设置)

常见的函数调用约定:

VC6.0中

调用约定 堆栈清理       参数传递

__cdecl  调用者(手动清栈) 右→左(堆栈传递)C语言默认的函数调用方法

__stdcall   函数体(自动清栈)  右→左(堆栈传递)       C++的标准调用方式

__fastcall  函数体(自动清栈)右→左(优先使用寄存器)涉及的寄存器由编译器决定

__thiscall  函数体(自动清栈)右→左(this指针默认通过ecx传递)     涉及的寄存器由编译器决定



#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall

几乎每一个WINDOWS API函数都是__stdcall类型的, 原因如下:

函数调用时需要用到栈, 当函数调用完成后, 栈需要清理, 那么如何清理?

1. 如果使用__cdecl, 那么由调用者清理, 不同的编译器产生栈的方式不同, 调用者无法正常完成清除工作.

2.如果使用__stdcall,那么由函数自己清理. 


带有可变参数的函数只能使用__cdecl方式, (它的参数个数是可变的, 不定长的, 而函数自身无法预先知道参数的个数, 那么事后的清理工作也无法正常进行.)

例:

int printf(char* fmtStr, .......)

int scanf(char* fmtStr, ......)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值