如何在不污染其余代码的情况下包含WinAPI

How to include WinAPI without contaminating the rest of the code?

本文关键字:代码 情况下 WinAPI 包含 污染 余代码      更新时间:2023-10-16

我正在C++中开发一个库,其中一部分是我需要的几个操作系统函数的抽象层。我开始用Windows API实现这一点,但计划用#ifdef等添加对其他平台的支持。

然而,开始成为一个问题的是,包括Windows.h会传播到我不需要它的代码的其余部分,尤其是,由于它是一个库,它还会污染其他使用它的人的代码。如果Windows API使用名称空间或某种明确的方式来区分代码,我并不介意,但它们定义了许多非常常见的单词,如small、near、far(小写),许多函数名称也非常通用。

因此,我真的希望只有我代码中特定于平台的部分可以访问这些内容,而不会包含在其他任何地方。我知道显而易见的解决方案是只在CPP文件中包含Windows.h,但这并不总是可能的,因为一些特定于平台的数据类型或结构是类成员变量,例如:

class Window {
public:
    // ...
private:
    HWND handle;
};

那么,有办法做到这一点吗?

谢谢。

使用pimpl习语(http://en.wikipedia.org/wiki/Opaque_pointer)。C++编程语言的局限性使得有必要使用这样的技巧来隐藏信息。

其中一种方法是以与C中相同的方式进行操作(因为以下原因,您根本没有这个问题):在头文件中正向声明一个结构,并在实现文件中定义其内容。

大多数人通过将示例的整个私有部分提取到其自己的结构中来实现这一点,该结构的内容只在实现文件中定义,并且只在头文件中放置指向它的指针,作为类私有部分的唯一成员。

此外,在#include之前#define WIN32_LEAN_AND_MEAN,以便去掉windows.h给您的内容。

相关文章: