调用约定__cdecl和__stdcall

首先,__cdecl,c declaration,C风格声明。或者 c default calling(笔者瞎编的)。(那么问题来了,为何PASCAL风格被称为std?)c++

调用约定的内容包括三点:参数出入栈顺序,弹栈工做由谁作,以及产生函数名的方式(renaming?)程序员

1.windows

在参数入栈顺序上,__cdecl和__stdcall没有区别都是从右往左;函数

2.io

__cdecl既然是c/c++默认,让咱们回忆下下stl中的printf这样的变长参数函数,只有调用者才知道实参的状况,所以由调用者去负责恢复栈,大概是比较恰当的。二进制

那么结论来了,__cdecl,指定了由调用者负责弹栈。程序

接着往下……方法

调用者负责弹栈,意味着,在最终的可执行代码中,全部调用被指定为__cdecl的方法的地方都会相对__stdcall多生成一段清理栈的代码。call

换句话说,若是windows API做为一套已存在的系统/二进制码/或者其余什么,当它在调用应用程序提供的函数的时候,已经没办法知道程序员提供的方法(CALLBACK/WINAPI)要如何清理栈,stl

更不可能有机会将处理栈的代码新增到这套已经存在的“系统/二进制码/或者其余什么”中,所以必须由函数提供方自行处理栈。

这也就是CALLBACK/WINAPI为何是__stdcall的缘由。

3.

略。

相关文章
相关标签/搜索