【问题标题】:precompiled Headers C++预编译头文件 C++
【发布时间】:2011-06-27 07:51:09
【问题描述】:

假设

我们有 c++ 项目(静态)库“A”,它使用 DirectX 头文件作为预编译头文件来实现基本图形引擎。

我们有项目(静态)库“B”,它使用“A”头文件作为预编译头文件来实现游戏引擎

我们有 c++ 项目“C”,它使用之前的两个项目来实现游戏

现在我的问题是:

项目“C”有什么方法可以只包含项目“B”而不包含(DirectX 标头和“A”标头)?

或者另一方面

有没有办法将(DirectX 和项目“A”)嵌入到项目“B”?

坦克

【问题讨论】:

    标签: c++ directx precompiled-headers


    【解决方案1】:

    只需确保项目 B 有一些干净的接口标头,这些标头公开了可以从 C 模块中使用的游戏引擎的功能,而无需提供任何详细信息它们是如何实现的。这些可能是抽象类或遵循接口的约定。它们应该是 C 需要包含的所有内容。所有 DirectX 内容都可以位于不供外部使用的私有文件中。

    【讨论】:

    • 例如:如果我在项目'A'中定义了Vector3,我不能在项目'C'中使用它?
    • 在这种情况下,请确保包含 Vector3 类定义的头文件不包含任何 DirectX 相关数据,然后将其包含在项目 B 的接口头中,以便在项目 C 中自动可见包括 B。如果不可能(即 A 中的 Vector3 直接映射到 DirectX 类型),您可以考虑在模块 B(基于双精度)中创建一个更抽象的 Vector3 版本,该版本在内部将函数调用委托给 A 中的 Vector3。
    【解决方案2】:

    预编译的头文件应该绝不暴露给库的用户。它们是库实现的细节;而已。 PCH 是 .cpp 文件包含的内容;它们不应该被包含在头文件中。

    记住:头文件应该只包含该头文件绝对需要的内容才能编译。

    让我们举个例子。项目 A 使用 DirectX。因此,项目 A 中的 .cpp 文件包括一个包含 DirectX 标头的 PCH。现在,如果项目 A 的接口使用 DirectX 对象和类型,那么项目 A interface 标头(项目 A 的用户使用的标头)将需要包含 DirectX 标头。

    这不会影响项目 A 使用 PCH 来缩短编译时间的能力。 DirectX 标头具有包含保护,因此它们不会被包含多次。将它们包含在 Project A 的接口标头中不需要任何成本。

    使用项目 A 的项目 B 将拥有自己的 PCH 文件。此 PCH 将包括 DirectX 和 Project A 的标头。因此,在 Project A 的 headers 中包含 DirectX 不会影响 Project B 的构建时间。

    项目 B 使用项目 A。但是,正如您所描述的,项目 B 不会将项目 B 的任何用户暴露给项目 A 或 DirectX。也就是说,项目 B 使用项目 A 的事实是项目 B 的一个实现细节,因此不应该暴露给项目 B 的用户。

    因此,项目 B 的接口标头(项目 B 的用户使用的标头)不包含来自项目 A 或 DirectX 的任何内容。因此,这个使用项目B的项目C将不包含它们。

    【讨论】:

    • +1 以获得非常清晰的解释,并提到包含防护在使用 PCH 时也很有效。这是我的谜题中缺少的部分(虽然在阅读后很明显:))
    【解决方案3】:

    由于 B 项目包含/链接到项目 A,因此无需在项目“C”中包含“A”。项目 B 将包含项目 A 中的所有内容,因此项目 C 将包含所有 A 和 B。

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2010-11-20
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2012-12-02
      • 2020-07-19
      相关资源
      最近更新 更多