调用约定
来源:互联网 发布: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, ......)
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- 调用约定
- C语言中关于除法和取余的理解
- AlterDialog简单使用一
- latex 基本用法(五)
- synchronized(this)和synchronized(object)区别
- Deep Learning(深度学习)学习笔记整理系列之(一)
- 调用约定
- 关于个别网页打不开,的问题分析及解决方法
- Vim简明教程
- java 的jdk与jre的作用和区别
- 安装SQL Server 2008 哪些功能需要选择?
- div的显示
- 嵌入式linux的网络编程(2)--TCP Server程序设计
- c++ 间接方式改变const变量
- 返回动态SQL语句中执行结果值