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

时间:2017-11-10 19:33:59

标签: c++ static-libraries

我正在创建一个静态库,我打算让其他人使用。这个静态库使用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
}

1 个答案:

答案 0 :(得分:2)

包含Windows.h的次数并不重要,它已将其内容包含在#ifndef - #endif结构中。如果它被包含一次,则已经定义了一些宏,并且标题中的代码将不再包含在内。

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

编辑:澄清您的上一次修改。

公共API应位于您库的.h中。如果Windows.h不属于您提供的API,则最好将其放在.cc中,这样,第二个选项。相反,如果您的公共API定义中使用Windows.h中的某些定义,请将其包含在您的.h。