当前位置:  开发笔记 > 开发工具 > 正文

什么是__stdcall?

如何解决《什么是__stdcall?》经验,为你挑选了6个好方法。

我正在学习Win32编程,WinMain原型如下:

int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

我很困惑这个WINAPI标识符的用途和发现:

#define WINAPI      __stdcall

这是做什么的?在返回类型之后,我对此感到困惑.什么是__stdcall?当返回类型和函数名称之间有什么东西时,它是什么意思?



1> Rob Walker..:

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

还有一些其他的调用约定,__cdecl,__thiscall,__fastcall和奇妙命名__naked. __stdcall是Win32系统调用的标准调用约定.

维基百科涵盖了细节.

当您调用代码之外的函数(例如OS API)或操作系统正在调用您时(例如WinMain的情况),这主要很重要.如果编译器不知道正确的调用约定,那么由于无法正确管理堆栈,您可能会遇到非常奇怪的崩溃.


有关非常严重崩溃的示例,请参阅此问题http://stackoverflow.com/questions/696306/run-time-check-failure-0-loading-queryfullprocessimagename-from-kernel32-dl​​l

2> Johannes Sch..:

C或C++本身不定义这些标识符.它们是编译器扩展,代表某些调用约定.这决定了放置参数的位置,以什么顺序放置,被调用函数将在何处找到返回地址,等等.例如,__ fastcall意味着函数的参数通过寄存器传递.

在维基百科条目提供了不同的调用约定概述发现那里.



3> 小智..:

到目前为止的答案已经涵盖了细节,但如果你不打算下载到程序集,那么你必须知道的是调用者和被调用者必须使用相同的调用约定,否则你会得到错误很难找到.



4> Windows prog..:

我同意到目前为止所有的答案都是正确的,但这就是原因.Microsoft的C和C++编译器为应用程序的C和C++函数中的(预期)函数调用速度提供了各种调用约定.在每种情况下,调用者和被调用者必须就使用哪种调用约定达成一致.现在,Windows本身提供了功能(API),并且已经编译了这些功能,所以当你调用它们时,你必须遵守它们.对Windows API的任何调用以及来自Windows API的回调都必须使用__stdcall约定.


并且它不能与_standard_call混淆,因为它是标准-c!如果一个人不知道更好,人们可能会认为这将是__stdcall的重点
一个小的挑剔:有一些Windows API使用__cdecl而不是__stdcall - 通常是那些采用可变数量参数的,例如wsprintf().

5> 小智..:

看一下:

http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx



6> Joel Coehoor..:

它与调用函数的方式有关 - 基本上是事物放在堆栈上的顺序以及谁负责清理.

这是文档,但除非你理解第一部分,否则它没有多大意义:http:
//msdn.microsoft.com/en-us/library/zxk0tw93.aspx

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有