为什么MinGW将Win API函数定义为宏?
Why does MinGW define Win API functions as macro?
我想知道为什么这么多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的参考资料,这个答案是指
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数