众所周知,包括通过每个Win32 API函数有一个预处理器#define(可以采用多字节或UTF-16输入)来<windows.h>污染C++中的所有命名空间.一个例子是:
#ifdef UNICODE
#define CreateFont CreateFontW
#else
#define CreateFont CreateFontA
#endif
Run Code Online (Sandbox Code Playgroud)
我已经使用原生的Win32 API已经有好几年了,但我只是放弃了!在任何非平凡的项目中都有足够的名称碰撞使你的脸变蓝. 请噢,有人能提出一个解决方案,不需要我#undef这样定义宏,事后根据具体情况而定吗?我想在此之前采取肯定行动导致任何错误.
我总是使用Unicode/UTF-16,所以在CreateFont的情况下,我会直接在我的代码中调用CreateFontW; 我不会使用宏定义.是否有人对此有解决方案,比如带有#undef的完整标题与windows.h包含在一起?
在任何地方都出现的一个示例错误是,需要使用像"GetMessage()"这样的通用名称.
font.cpp(78) : error C2039: 'GetMessageW' : is not a member of 'FontManager'
Run Code Online (Sandbox Code Playgroud)
当你想要的只是你的类有一个名为void GetMessage()的成员函数时.太令人沮丧了.
Jam*_*lis 11
最干净的解决方案不是直接在程序中调用Windows API函数,而是编写一个可以调用所需函数的抽象层.这样,您只需要在少量源文件中包含Windows API标头,并且宏更易于管理.
这还有一个额外的好处,即提高代码的可移植性,因为它只有一小部分依赖于Windows API本身,其余部分将调用您的抽象层.
即使您不关心可移植性,抽象层仍然有很多好处:您的代码将更易于阅读和更易于维护,因为进行API调用的复杂性将封装在抽象层(某些Windows)中API函数有很多你通常不关心的函数.
由于您使用的是C++,因此如果您更喜欢使用异常,抽象层还可以允许您将Windows API错误代码转换为异常.
抽象层也有助于使代码更容易测试(模拟抽象层比模拟部分或部分Windows API容易得多).
| 归档时间: |
|
| 查看次数: |
1571 次 |
| 最近记录: |