如何在不污染其余代码的情况下包含WinAPI
How to include WinAPI without contaminating the rest of the code?
我正在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给您的内容。
相关文章:
- 这个c++代码是如何在没有定义函数的情况下运行的
- 如何在没有函数的情况下编写此代码并使C++更简单?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 可以在没有构建代码的情况下转到定义吗?
- 在没有引用传递资源的情况下,如何在java中简化这些代码
- 尝试在不使用转换概念的情况下呈现此代码
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 在运行时,何时完全初始化 std 库才能在不破坏代码的情况下使用它?
- 在存在错误代码的情况下输出参数与 NRVO
- 在给定相同的输入的情况下,某些代码怎么可能花费更多时间来运行,这似乎只是因为它处于循环中?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 为什么我的代码在没有 chroot 函数的情况下工作,但使用 chroot 函数失败?
- 如何在不复制此代码的情况下将多个函数放入多个命名空间?
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 在没有额外代码的情况下链接两个独立类的最通用方法是什么?
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此大括号初始化列表代码
- 打包结构,而不是在没有代码重复的情况下打包
- 如何在不中断剩余代码的情况下仅C++中输入整数
- 如何在<typename> <long> 不更改给定代码的情况下将自定义向量与 STL 向量相互转换?