我应该如何包含在我的静态库中?

布兰登伍尔沃思

我正在创建一个供其他人使用的静态库。这种静态库采用了Windows头,并且在许多它使用了Windows定义功能,如DWORD,PDWORD,LPVOID,等等。我想这是有点严格为在我的库中定义函数,减少误用。但是,如果我在我的静态库的头文件中包含 Windows 头文件,那么包含我的库的人将自动包含 Windows 头文件,并且我不相信这是执行此过程的正确方法我通常包含在其他项目中的库也要求我包含正确的头文件。那么我应该如何“要求”使用我的库的人也包含 windows 标题,或者至少让我的库检查是否已经包含 windows 标题?这也适用于其他标头,只是一般情况下(即,如果我必须包含 iostream,那么我想检查是否已包含 iostream 标头)。

本质上,我的静态库应该优先于用户的所有包含,还是根据用户已经包含的内容进行调整?如果用户包含我的库,让他们简单地包含我的库的标题而不包含其他内容会更好,还是有某种方法可以使用户在我的库之外包含他们需要的内容?

为了一些额外的清晰度:

#include "MyLibrary.h"
BOOL WINAPI DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpvReserved) {
    // Stuff
}

或者

#include <Windows.h>
#include "MyLibrary.h"
BOOL WINAPI DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpvReserved) {
    // Stuff
}
安东

无论您包含多少次Windows.h,它都已经将其内容包含在#ifndef-#endif构造中。如果它被包含一次,那么一些宏已经被定义并且头文件中的代码将不会被再次包含。

另一方面,如果您的库是静态的,则它不再依赖于任何外部代码,所有来自Windows.h库的符号实际上都是该库私有的,其他任何东西都看不到。

编辑:澄清您上次的编辑。

公共 API 应该在您的库的 .h 中。如果Windows.h不是你提供的 API 的一部分,你最好把它放在你的 .cc 中,所以,第二个选择。相反,如果在Windows.h公共 API 的定义中使用了某些定义,请将其包含在 .h 中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果目标变量未包含在二元分类任务的测试数据中,我应该如何预测它

如何将仅包含结构的.h文件包含在静态库中

如何将我的部分代码包含在“收益”中?

如何确保vuex商店包含在我的版本中?

我如何将SASS mixin包含在变量中?

我如何在没有pip的情况下将github中的库包含在python项目中?

我如何编译使用外部依赖项的C#库,而无需将其包含在库中?

我是否应该将scala-compiler作为依赖项包含在build.sbt中?

CMSIS 库是否应该包含在版本控制中?

CMake configure_file未包含在静态库中

我应该在主文件中包含已经包含在.h文件中的标头吗?

如果标头已经包含在预编译的标头中,我应该继续在源文件中包含标头吗?

为什么我的本地存储库的依赖项没有包含在 Maven 中?

我应该让我的数据库类静态

我的标题被包含在我的主标签中

我是否需要在主 cpp 中包含库,即使它已包含在头文件中?

我应该将 IIoT 作为次要参与者包含在我的用例图中吗?

链接到可执行文件时,如何强制将目标文件包含在静态库中?

如何配置我的.travis.yml文件以运行用于生成映像的脚本,该脚本已作为存储库中的.sh文件包含在内

我应该如何清理Java中的数据库输入?

我应该如何使用 firebase 数据库中的 id

我应该如何让用户定义库中的函数?

如何在Swift 3中使用我的静态库(.a)

如何知道对象是否包含在我的jQuery数组列表中?

如何将脚本单独包含在我的构建文件夹中?

如何将我的应用程序作为模块包含在Swift Playground中?

在构建内核之前,我如何知道哪些文件将包含在linux内核中?

如何省略包含在我的 yarn.lock 文件中的包?

如何让源地图将我所有的LESS文件都包含在gulp中