如何避免的#include依赖于外部库(How to avoid #include dependen

2019-08-04 10:37发布

如果我创建一个头文件,如这个静态库:

// Myfile.h

#include "SomeHeaderFile.h" // External library

Class MyClass
{

// My code

};

在我自己的项目,我可以告诉编译器(在我的情况下,Visual Studio)到哪里寻找SomeHeaderFile.h。 不过,我不希望我的用户是关心这一点-他们应该能够包括我的头,而无需告知编译器有关SomeHeaderFile.h的位置。

如何在这种情况通常如何处理?

Answer 1:

这是一个典型的“编译防火墙”的情景。 有两个简单的解决方案做:

  1. 前瞻性声明您从外部库需要的任何类或函数。 然后包括外部库的头文件只能在你的CPP文件(当你真正需要使用你的头,你前瞻性声明的类或函数)。

  2. 使用PIMPL方法(或柴郡猫),您前瞻性声明,声明只有私下定义(在cpp文件)的“执行”类。 您使用的私有类把所有的外部库相关的代码,以避免在公共类的任何痕迹(一个在头文件中声明)。

下面是使用第一个选项的例子:

#ifndef MY_LIB_MY_HEADER_H
#define MY_LIB_MY_HEADER_H

class some_external_class;  // forward-declare external dependency.

class my_class {
  public:
    // ...
    void someFunction(some_external_class& aRef);  // declare members using the forward-declared incomplete type.
};

#endif

// in the cpp file:

#include "my_header.h"
#include "some_external_header.h"

void my_class::someFunction(some_external_class& aRef) {
  // here, you can use all that you want from some_external_class.
};

下面是选择2的示例:

#ifndef MY_LIB_MY_HEADER_H
#define MY_LIB_MY_HEADER_H

class my_class_impl;  // forward-declare private "implementation" class.

class my_class {
  private:
    std::unique_ptr<my_class_impl> pimpl; // a vanishing facade...
  public:
    // ...
};

#endif

// in the cpp file:

#include "my_header.h"
#include "some_external_header.h"

class my_class_impl {
  private:
    some_external_class obj;
    // ...
  public:
    // some functions ... 
};

my_class::my_class() : pimpl(new my_class_impl()) { };


Answer 2:

说外部头文件包含以下内容:

external.h

class foo
{
public:
   foo();
};

而在你的库中使用富:

myheader.h:

#include "external.h"

class bar
{
...
private:
   foo* _x;
};

为了让您的代码编译,所有你需要做的就是转发声明Foo类(后您可以删除包含):

class foo;

class bar
{
...
private:
   foo* _x;
};

然后,您必须包括在源文件中external.h。



文章来源: How to avoid #include dependency to external library