如何在不污染其余代码的情况下包含WinAPI? 我在C++中开发了一个库,它的一部分是我需要的几个OS函数的抽象层。我开始使用Windows API实现这一点,但计划使用#ifdef等为其他平台添加支持

如何在不污染其余代码的情况下包含WinAPI? 我在C++中开发了一个库,它的一部分是我需要的几个OS函数的抽象层。我开始使用Windows API实现这一点,但计划使用#ifdef等为其他平台添加支持,c++,winapi,C++,Winapi,然而,开始成为问题的是,包括Windows.h会传播到我不需要它的代码的其余部分,特别是,因为它是一个库,它还会污染其他使用它的人的代码。我并不介意Windows API是否使用了名称空间或某种明确的方式来区分其代码,但相反,它们定义了许多非常常见的词,如small、near、far(小写),而且许多函数名也非常通用 所以我真的希望,如果我的代码中只有特定于平台的部分可以访问这些,而不包括在其他任何地方。我知道显而易见的解决方案是在CPP文件中只包含Windows.h,但这并不总是可能的,因为某

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

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

class Window {

public:

    // ...

private:
    HWND handle;

};
那么有没有办法做到这一点呢

谢谢。

使用pimpl成语()。C++编程语言的局限性使得有必要使用这样的技巧来获得信息隐藏。p> 其中一种方法是以与在C中相同的方式执行(在C中根本没有这个问题,因为以下原因):在头文件中向前声明一个结构,并在实现文件中定义其内容

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


此外,在“包含”之前定义WIN32和“精简”的意思,以便剥离windows.h提供给您的内容。

您的库是否需要导出任何windows.h定义供库用户使用,或者您的库是否仅在内部使用WIN32 API,因此只需要导出您的声明?它应该只在内部使用Windows特定的函数。似乎您可以将对象重构为更像接口/包装器的对象,在这里,您的客户端调用对象工厂来创建接口的派生实例。派生类包含HWND等实现细节。@franji1我想你是对的,我没有想到这一点。:)谢谢+1这比我要写的答案要好:导出一堆“接口”和对象工厂,其中派生的实现类具有HWND类型的数据成员,但接口只是这样,没有实现细节。对了,我想我现在明白了,这正是我想要的,谢谢。