n 1 k z z z Asked:2022-08-18 05:09:57 +0800 CST2022-08-18 05:09:57 +0800 CST 2022-08-18 05:09:57 +0800 CST 为什么 WinMain 应该使用 __stdcall? 772 我有一个问题,为什么入口点WinApi必须有一个调用约定__stdcall?我知道使用不同的调用约定,堆栈的管理方式不同,函数有不同的标识符,但我还是不明白为什么会这样?这条规则的技术原因是什么(如果有的话)?提前感谢您的回复:) c++ 1 个回答 Voted Best Answer KoVadim 2022-08-18T14:36:53+08:002022-08-18T14:36:53+08:00 正如我所写的——简短的回答——它发生了。 Full 更有趣一点。很多人认为 main/WinMain 是程序的入口点。但在大多数情况下并非如此。事实上,这个函数并不是第一个被调用的。首先,启动 CRT(又名 RunTime,又名启动代码,以及更多名称)。此代码初始化静态变量,准备环境(相同的cin/ cout),并在退出时main执行相反的过程,调用各种atexit。 很明显,所有这些代码都依赖于某种协议,使用另一种语言“API”。但为什么是__stdcall,而不是其他的?一切都很简单。某种协议是必要的。我们该拿哪一个?对,我们的,我们为自己制作并在 WinAPI 中随处使用 - __stdcall __stdcall 调用约定用于调用 Win32 API 函数。被调用者清理堆栈,因此编译器生成可变参数函数 __cdecl。使用此调用约定的函数需要函数原型。__stdcall 修饰符是Microsoft 特定的。 (选择是我的) 更多阅读https://docs.microsoft.com/en-us/cpp/build/reference/entry-entry-point-symbol?view=msvc-160
正如我所写的——简短的回答——它发生了。
Full 更有趣一点。很多人认为 main/WinMain 是程序的入口点。但在大多数情况下并非如此。事实上,这个函数并不是第一个被调用的。首先,启动 CRT(又名 RunTime,又名启动代码,以及更多名称)。此代码初始化静态变量,准备环境(相同的
cin
/cout
),并在退出时main
执行相反的过程,调用各种atexit。很明显,所有这些代码都依赖于某种协议,使用另一种语言“API”。但为什么是
__stdcall
,而不是其他的?一切都很简单。某种协议是必要的。我们该拿哪一个?对,我们的,我们为自己制作并在 WinAPI 中随处使用 - __stdcall(选择是我的)
更多阅读https://docs.microsoft.com/en-us/cpp/build/reference/entry-entry-point-symbol?view=msvc-160