我正在学习Win32编程,WinMain原型看起来像这样:
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )我搞不懂这个WINAPI标识符是用来做什么的,结果发现:
#define WINAPI __stdcall这是做什么的?我对在返回类型之后有一些东西感到困惑。__stdcall是用来做什么的?当返回类型和函数名之间存在某些东西时,这意味着什么?
发布于 2008-11-18 02:18:06
__stdcall是用于函数的调用约定。这将告诉编译器适用于设置堆栈、推送参数和获取返回值的规则。
还有许多其他的调用约定,__cdecl、__thiscall、__fastcall和名字很棒的__declspec(naked)。__stdcall是Win32系统调用的标准调用约定。
维基百科涵盖了details。
当你在代码之外调用一个函数(例如,OS )或者操作系统正在调用你(就像这里的WinMain)时,这是最重要的。如果编译器不知道正确的调用约定,那么很可能会出现非常奇怪的崩溃,因为堆栈将无法正确管理。
发布于 2008-11-18 02:20:27
C或C++本身并没有定义这些标识符。它们是编译器扩展,代表特定的调用约定。这决定了将参数放在哪里,以什么顺序,被调用的函数将在哪里找到返回地址,等等。例如,__fastcall意味着函数的参数通过寄存器传递。
Wikipedia Article提供了不同调用约定的概述。
发布于 2008-11-18 02:24:57
到目前为止,答案已经涵盖了细节,但如果您不打算直接使用程序集,那么您所需要知道的就是调用者和被调用者必须使用相同的调用约定,否则就会得到很难找到的but。
https://stackoverflow.com/questions/297654
复制相似问题