Answers:
__stdcall
是用于该函数的调用约定。这将告诉编译器适用于设置堆栈,推送参数和获取返回值的规则。
还有一些其他的调用约定,__cdecl
,__thiscall
,__fastcall
和奇妙命名__declspec(naked)
。 __stdcall
是Win32系统调用的标准调用约定。
维基百科涵盖了细节。
当您在代码外调用函数(例如OS API)或OS在调用您(WinMain就是这种情况)时,这尤其重要。如果编译器不知道正确的调用约定,则由于堆栈管理不当,您可能会遇到非常奇怪的崩溃。
C或C ++本身未定义这些标识符。它们是编译器扩展,代表某些调用约定。这决定了将参数放在何处,以什么顺序放置,被调用函数将在哪里找到返回地址,等等。例如,__fastcall表示函数的参数通过寄存器传递。
在维基百科的文章提供了发现有不同的调用约定的概述。
我同意到目前为止所有答案都是正确的,但这是原因。Microsoft的C和C ++编译器为应用程序的C和C ++函数内的(预期)函数调用速度提供了各种调用约定。在每种情况下,主叫方和被叫方必须就使用哪种呼叫约定达成一致。现在,Windows本身提供了功能(API),并且这些功能已经被编译,因此,在调用它们时,必须遵循它们。对Windows API的任何调用以及来自Windows API的回调都必须使用__stdcall约定。
它与函数的调用方式有关-基本上是将事物放入堆栈的顺序以及负责清除的人员。
这是文档,但是除非您了解第一部分,否则它并没有多大意义:http :
//msdn.microsoft.com/zh-cn/library/zxk0tw93.aspx
直到今天,我再也不需要使用它。这是因为在我的代码中我正在使用多线程,而我正在使用的多线程API是Windows一(_beginthreadex)。
要启动线程:
_beginthreadex(NULL, 0, ExecuteCommand, currCommand, 0, 0);
ExecuteCommand函数必须在方法签名中使用__stdcall关键字,以便beginthreadex调用它:
unsigned int __stdcall Scene::ExecuteCommand(void* command)
{
return system(static_cast<char*>(command));
}
s来解决愚蠢的(至少适得其反的情况)至少6个字符。