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

qua*_*els 5 c++ winapi

我正在学习关于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);
}
Run Code Online (Sandbox Code Playgroud)

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

显然,我正在写Windows API.难道WINAPI不知何故标志,以便程序使用Windows API来执行它什么功能?

Set*_*gie 8

WINAPI是一个预处理器定义,定义为__stdcall一个调用约定; 当函数__stdcall在其名称之前有,它是编译器的一个指令,使函数使用该调用约定.这是你的函数和调用你的函数的函数都同意使用stdcall调用约定并且调用正确执行.

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

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

一个调用约定是做这样的事情,其中的参数应该去堆栈,谁应该从堆栈中删除它们当函数返回时,在那里把返回值,和其他东西上的顺序的方法.不同的调用约定以不同的方式实现.最重要的是,调用者和被调用者都遵循相同的调用约定是非常重要的.有关调用约定的更多信息,请参阅Wikipedia文章.

  • @quakkels 非常好,但不是绝对有必要知道。如果您曾深入研究 C++ 程序的生成程序集,则有必要了解调用约定,否则它可以被视为实现细节(隐藏在“WINAPI”预处理器定义后面)。可能(尽管我没有证据)许多 C++ 程序员在不了解调用约定的情况下编写了精美的程序。不过,更多地了解底层的工作原理从来都不是坏事:) (2认同)