C++ _cdecl和_stdcall区分
来源:互联网 发布:北京交通大学校训知行 编辑:程序博客网 时间:2024/06/07 14:33
1. _cdecl
(1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函
数调用方法。
(2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:调用
方的函数调用->被调用函数的执行->被调用函数的结果返回->调用方清除调整堆栈。 (3). 被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全
不同的参数都不会产生编译阶段的错误。总的来说函数的参数个数可变的(就像printf函数一样),因为只有调用者才知道它传给被调用函数几个参数,才能在调用结束时适当地调整堆栈。
(4). 因为每个调用的地方都需要生成一段调整堆栈的代码,所以最后生成的文件较大。
2. _stdcall(CALLBACK/WINAPI)
(1). 是Standard Call的缩写,要想函数按照此调用方式必须在函数名加入_stdcall,通常_
win32 api 应该是_stdcall调用规则。通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为_stdcall 方式,WINAPI都采用这种方式。
(2). 所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。具体所示:调用方的函数调用->被调用函数的执行-> 被调用方清除调整堆栈->被调用函数的结果返回。
(3). 这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retn X,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。 (4). 函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能
多,不能少,否则返回后会出错。总的来说,就是函数的参数个数不能是可变的。是从 _cdecl 修改而来, _stdcall 不支持可变参数,并且清栈由被调用者负责,其他的都一样 (5). 因为只需在被调用函数的地方生成一段调整堆栈的代码,所以最后生成的文件较小。
(1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函
数调用方法。
(2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:调用
方的函数调用->被调用函数的执行->被调用函数的结果返回->调用方清除调整堆栈。 (3). 被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全
不同的参数都不会产生编译阶段的错误。总的来说函数的参数个数可变的(就像printf函数一样),因为只有调用者才知道它传给被调用函数几个参数,才能在调用结束时适当地调整堆栈。
(4). 因为每个调用的地方都需要生成一段调整堆栈的代码,所以最后生成的文件较大。
2. _stdcall(CALLBACK/WINAPI)
(1). 是Standard Call的缩写,要想函数按照此调用方式必须在函数名加入_stdcall,通常_
win32 api 应该是_stdcall调用规则。通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为_stdcall 方式,WINAPI都采用这种方式。
(2). 所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。具体所示:调用方的函数调用->被调用函数的执行-> 被调用方清除调整堆栈->被调用函数的结果返回。
(3). 这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retn X,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。 (4). 函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能
多,不能少,否则返回后会出错。总的来说,就是函数的参数个数不能是可变的。是从 _cdecl 修改而来, _stdcall 不支持可变参数,并且清栈由被调用者负责,其他的都一样 (5). 因为只需在被调用函数的地方生成一段调整堆栈的代码,所以最后生成的文件较小。
- C++ _cdecl和_stdcall区分
- _stdcall和_cdecl,extern “C”的联系
- _cdecl 和_stdcall
- 【转】_cdecl 和_stdcall
- _cdecl 和_stdcall
- _cdecl 和_stdcall
- _cdecl和_stdcall
- _cdecl 和_stdcall
- _stdcall 和 _cdecl
- _cdecl 和_stdcall
- _cdecl,_stdcall和_fastcall
- _cdecl 和_stdcall
- _cdecl和_stdcall
- _cdecl 和 _stdcall
- _stdcall和_cdecl
- _stdcall 和 _cdecl
- _cdecl 和_stdcall
- _cdecl 和_stdcall
- 辗转相除法原理实现最大公约数的求解
- Android网络通信框架Volley简介(Google IO 2013)
- Android开发把项目打包成apk
- 状态压缩入门 摆放车子
- 深度解析:清理烂代码
- C++ _cdecl和_stdcall区分
- 第五章 TCP回射客户程序
- 用Scertify Professional实现代码审查
- 诸葛亮写给后代的一封信,只有86个字
- 黑马程序员-winform视频总结的一些知识点
- WIFI手动命令行连接AP
- Internet Explorer 11: “请不要再叫我 IE”
- 根据数组,生成数组中元素的所有组合,(顺序,与非顺序)
- MYSQL 索引