3

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

然而,开始成为一个问题的是,包括 Windows.h 会传播到我不需要它的整个其余代码,特别是,因为它是一个库,它也会污染其他人的代码它。我真的不介意 Windows API 是否使用命名空间或某种清晰的方式来区分其代码,而是它们 #define 了很多非常常见的词,例如 small、near、far(小写)和很多函数名也很一般。

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

class Window {

public:

    // ...

private:
    HWND handle;

};

那么有没有办法做到这一点?

谢谢。

4

1 回答 1

6

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

这样做的方法之一是与在 C 中的方法相同(由于以下原因,您根本没有这个问题): 在头文件中前向声明一个结构并在其中定义其内容实施文件。

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

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

于 2013-02-07T15:08:46.573 回答