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

时间:2013-06-07 19:10:02

标签: c++ c winapi mingw

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

示例:

MessageBox()功能,如MSDN documenation

中所述
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);

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

有没有理由这样做?为什么它们没有被实现为“真正的”函数(使用它们的真实姓名)?

2 个答案:

答案 0 :(得分:6)

来自GetVersionEx documentation

  

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

来自Conventions for Function Prototypes documentation

  

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

在您的情况下,GetVersionEx会扩展为GetVersionExA,因为您似乎正在使用Windows code page

答案 1 :(得分:2)

使用DEFINE,您可以使用带有差异编译器选项的相同代码。例如:如果使用MessageBox,则MessageBoxW将使用unicode,如果不是MessageBoxA则会{{1}}。只需更改方法名称就必须通过整个代码库。

编辑:另见Christoph的参考,这个答案是指。