gpt4 book ai didi

c++ - 这个 WinMain() 声明中发生了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:43 28 4
gpt4 key购买 nike

我正在学习 C++ 和针对 Windows API 的编程。我的第一个“Hello Windows API”程序只显示一个 MessageBox()。但是,我有一些问题,我正在阅读的书没有解释。

首先,这是程序:

// HelloWin32 Program
#include<Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
MessageBox(NULL, "This gets displayed in the message.", "This is the title bar of the message dialog.", MB_OK | MB_ICONEXCLAMATION);
}

这编译并运行良好。我的问题与说明 int WINAPI WinMain(...) 的 WinMain() 声明有关。在我阅读它时,WinMain 函数(方法?)返回一个整数。但是 WINAPI 通信的是什么?

显然,我正在写入 Windows API。 WINAPI 是否以某种方式标记函数以便程序使用 Windows API 来执行它或其他什么?

最佳答案

WINAPI 是定义为__stdcall 的预处理器定义,一种调用约定;当函数的名称前有 __stdcall 时,它是指示编译器使函数使用该调用约定的指令。这样您的函数和调用您函数的函数都同意使用 stdcall 调用约定并且调用正确执行。

这是必要的,因为您的编译器的默认调用约定可能是也可能不是 stdcall,因此您必须明确告诉编译器为该函数采用这种方式。 Windows API的设计者主要出于兼容性的考虑和stdcall调用约定的普适性,决定让所有的函数调用都使用stdcall调用约定。

此外,您可以在同一程序中使用具有不同调用约定的函数。因此,例如,WinMain 必须是 stdcall,但程序的其他函数不是;他们可以使用编译器默认值。

调用约定 是一种方法,用于执行诸如参数进入堆栈的顺序、函数返回时谁应将它们从堆栈中移除、将返回值放在哪里以及其他事情。不同的调用约定以不同的方式执行此操作。最重要的是,调用者和被调用者都遵循相同的调用约定是极其重要的。有关调用约定的更多信息,请参阅 the Wikipedia article .

关于c++ - 这个 WinMain() 声明中发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9144417/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com