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

Why does MinGW define Win API functions as macro?

本文关键字:定义 函数 API MinGW Win 为什么      更新时间:2023-10-16

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

例子:

MSDN文档中描述的MessageBox()函数:

int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);

下面是MinGW (winuser.h)的实现:

#define MessageBox MessageBoxA
/* ... */
WINUSERAPI int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT);

所以MessageBox不是一个函数,它只是一个实函数的定义。

另一个(取自winbase.h:

)
#define GetVersionEx GetVersionExA
/* ... */
WINBASEAPI BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA);

正如你所看到的,在大多数情况下,函数都是作为宏来实现的。

这样做有什么原因吗?为什么它们没有被实现为"真实的"函数(使用它们的真实名称)?

来自GetVersionEx文档:

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

来自函数原型约定文档:

预处理器将宏展开为Windows代码页或Unicode函数名。字母"A" (ANSI)或"W" (Unicode)被适当地添加到泛型函数名的末尾。头文件然后提供两个特定的原型,一个用于Windows代码页,另一个用于Unicode,如下面的示例所示。

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

使用DEFINE使您能够使用不同编译器选项的相同代码。例如:如果使用unicode, MessageBox将使用MessageBoxW,但如果不使用MessageBoxA。如果只是为了更改方法名而必须遍历整个代码库,那将是一种痛苦。

编辑:也可以参考Christoph的参考资料,这个答案是指