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

 我来答
德克and德华

2018-03-20 · TA获得超过2649个赞
知道小有建树答主
回答量:1207
采纳率:100%
帮助的人:614万
展开全部
__cdecl:这是C/C++函数默认的调用规范,参数从右向左依次传递,压入堆栈,由调用函数负责堆栈的清退。这种方式适用于传递个数可变的参数给被调用函数,因为只有调用函数才知道它传递了多少个参数给被调函数。如printf函数。
__stdcall:参数从右向左依次传递,并压入堆栈,由被调用函数清退堆栈。该规范生成的函数代码比__cdecl更小,但当函数有可变个数参数,自动转化为__cdecl调用规范。

它们都是从右向左的。
最绅士的痞子灬
2018-05-29 · TA获得超过2.9万个赞
知道小有建树答主
回答量:146
采纳率:100%
帮助的人:2.2万
展开全部

1、 __stdcall调用类型:该调用只是通过堆栈来push和pop参数。push参数时,顺序是从右到左。

2、“_stdcall”的作用 :在C/C++中函数默认Calling Conventions(调用约定)是:参数由右向左压入栈,由调用者清空栈。

3、在FORTRAN、PASCAL、VisualBASIC等语言中,函数的Calling Conventions是:参数由右向左压入栈,由被调函数清空栈。

4、__cdecl调用类型: 这是C的调用规则。对于所有非C++成员函数或未标有__stdcall或__fastcall的函数来说,这是默认调用规则。

5、__fastcall调用类型:从字面意思可知,这是一种快速调用。因为CPU的寄存器会被使用来存放函数参数列表中的头几个参数。而剩下参数将被从右至左地推倒堆栈上。被调用函数将从 寄存器和堆栈获得函数参数。

6、在x86中,ECX和EDX一般被用来存放开始的参数。在.NET中,为了性能上的快速,就是使用ecx和edx来实现 __fastcall的。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
脐橙熟透了
2018-03-20 · TA获得超过1.4万个赞
知道小有建树答主
回答量:85
采纳率:100%
帮助的人:1.2万
展开全部

__stdcall

被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈。这个关键字主要见于Microsoft Visual C、C++。

GNU的C、C++是另外一种修饰方式:__attribute__((stdcall))。

__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:

1、参数传递顺序;

2、调用堆栈由谁(调用函数或被调用函数)清理;

常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

__stdcall表示

1、参数从右向左压入堆栈;

2、函数被调用者修改堆栈;

3、函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。

1、修饰名(Decoration name)

“C”或者“C++”函数在内部(编译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原

型时生成的字符串。有些情况下使用函数的修饰名是必要的,如在模块定义文件里头指定输出“C++”重载函数、构造函数、析构函数,又如在汇编代码里调用“C””或“C++”函数等。

修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。

2、名字修饰约定随调用约定和编译种类(C或C++)的不同而变化。函数名修饰约定随编译种类和调用约定

的不同而不同,下面分别说明。

a、C编译时函数名修饰约定规则:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式