如何运用c++里的“__stdcall”?

如何运用c++里的“__stdcall”?,第1张

__cdecl:这是C/C++函数默认的调用规范,参数从右向左依次传递,压入堆栈,由调用函数负责堆栈的清退运塌。这种方式适用于传递个数可变的参数给被调用函数,因为只有调用函数才知道它传递了多少个参数给被调函数。如printf函数。

__stdcall:参数从睁做右向左依次传递,并压入堆栈旁早圆,由被调用函数清退堆栈。该规范生成的函数代码比__cdecl更小,但当函数有可变个数参数,自动转化为__cdecl调用规范。

它们都是从右向左的。

C++函数调用有三种常见方式:thiscall,__cdecl,__stdcall

今天看了篇介绍的文章,才比较清楚了点。thiscall,用于类的成员函数调用,

__thiscall对每个函数都增加了一个类指针参数

class aa

{

void bb(int cc)

}

实际上bb的函数原形是void bb(aa &this, int cc)

以前知道类的成员函数在调用时会传入一个this指针,而不晓得thiscall就是专配则门指定了这种调用方式。__cdecl调用方式即为C,C++默认的调用方式。

void Input( int &m,int &n)/*相当于void __cdecl Input(int &m,int &n)*/

其特点是:1,由主调用函数进行参数压栈并且恢复堆栈;2,在主调用函数中进行实参的压栈并且顺序是从右到左;3,由于主调用函数管理堆栈,所以可以实现变参函数。

__stdcall则是标准调用方式,实际上就是PASCAL,CALLBACK,WINAPI ,其特点是:_主调用函数中负责压栈,在被调用函数中负责d出堆栈中的参数,并且负责恢复堆栈。因此不能实现变参函数,参数传递是从右到左。另外,命名修饰方法是在函数前加一个下划线(_),在函数名后培链棚有符号(@),在@后面紧跟参数列表中的参数所占字节数(10进制),唤毕如:void Input(int &m,int &n),被修饰成:_Input@8 。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12558743.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存