为什么MinGW将Win API函数定义为宏?

oll*_*llo 4 c c++ winapi mingw

我想知道为什么这么多的Win API函数只定义了它们在MinGW中的实际实现.

例:

MessageBox()功能如MSDN文档中所述:

int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);
Run Code Online (Sandbox Code Playgroud)

这是MinGW(winuser.h)的实现:

#define MessageBox MessageBoxA
/* ... */
WINUSERAPI int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT);
Run Code Online (Sandbox Code Playgroud)

所以MessageBox不是一个函数,它只是一个真正函数的定义.

另一个(取自winbase.h:

#define GetVersionEx GetVersionExA
/* ... */
WINBASEAPI BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA);
Run Code Online (Sandbox Code Playgroud)

正如您在大多数情况下所看到的,函数是作为实际实现的宏实现的.

这样做有什么理由吗?为什么它们没有被实现为"真正的"功能(使用它们的真实姓名)?

md5*_*md5 6

来自GetVersionEx文档:

Unicode和ANSI名称: GetVersionExW(Unicode)和GetVersionExA(ANSI)

来自函数原型的约定文档:

预处理器将宏扩展为Windows代码页或Unicode函数名.根据需要,在通用函数名称的末尾添加字母"A"(ANSI)或"W"(Unicode).然后,头文件提供两个特定的原型,一个用于Windows代码页,另一个用于Unicode,如以下示例所示.

在您的情况下,GetVersionEx将扩展为GetVersionExA因为它看起来像您正在使用Windows代码页.