函数的调用规则——简单记忆

函数的调用规则

各种调用方式,总是记不住,这里做个笔记(我这里只是速记,具体见文章最下边):

microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。调用约定可以通过工程设置:Setting...C/C++ Code Generation项进行选择,缺省状态为__cdecl。

__cdecl
所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的。返回值在EAX中。比如printf。格式为_functionname

__stdcall
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中。按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。切记:函数自己在退出时清空堆栈,返回值在EAX中。格式为_func@12(后者是参数的总字节数)

__fastcall
主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。返回仍然通过EAX。

__pascal
这种规则从左向右传递参数,通过EAX返回,堆栈由被调用者清除

__thiscall
仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定

参考:
http://my.oschina.net/alphajay/blog/6776

原文地址:https://www.cnblogs.com/findumars/p/3148928.html