首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是__stdcall?

什么是__stdcall?
EN

Stack Overflow用户
提问于 2008-11-18 02:15:39
回答 8查看 122K关注 0票数 165

我正在学习Win32编程,WinMain原型看起来像这样:

代码语言:javascript
复制
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

我搞不懂这个WINAPI标识符是用来做什么的,结果发现:

代码语言:javascript
复制
#define WINAPI      __stdcall

这是做什么的?我对在返回类型之后有一些东西感到困惑。__stdcall是用来做什么的?当返回类型和函数名之间存在某些东西时,这意味着什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-11-18 02:18:06

__stdcall是用于函数的调用约定。这将告诉编译器适用于设置堆栈、推送参数和获取返回值的规则。

还有许多其他的调用约定,__cdecl__thiscall__fastcall和名字很棒的__declspec(naked)__stdcall是Win32系统调用的标准调用约定。

维基百科涵盖了details

当你在代码之外调用一个函数(例如,OS )或者操作系统正在调用你(就像这里的WinMain)时,这是最重要的。如果编译器不知道正确的调用约定,那么很可能会出现非常奇怪的崩溃,因为堆栈将无法正确管理。

票数 195
EN

Stack Overflow用户

发布于 2008-11-18 02:20:27

C或C++本身并没有定义这些标识符。它们是编译器扩展,代表特定的调用约定。这决定了将参数放在哪里,以什么顺序,被调用的函数将在哪里找到返回地址,等等。例如,__fastcall意味着函数的参数通过寄存器传递。

Wikipedia Article提供了不同调用约定的概述。

票数 44
EN

Stack Overflow用户

发布于 2008-11-18 02:24:57

到目前为止,答案已经涵盖了细节,但如果您不打算直接使用程序集,那么您所需要知道的就是调用者和被调用者必须使用相同的调用约定,否则就会得到很难找到的but。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/297654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档