调用约定

来源:互联网 发布:ubuntu 安装firefox 编辑:程序博客网 时间:2024/05/16 17:23

调用约定:

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, ......)


 

0 0
原创粉丝点击