预编译的Headers C ++

时间:2011-06-27 07:51:09

标签: c++ directx precompiled-headers

假设

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

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

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

现在我的问题是:

项目'C'是否有任何方式只包含项目'B'而不包括(DirectX标题和'A'标题)?

或另一方面

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

3 个答案:

答案 0 :(得分:2)

只需确保项目B有一些干净的界面标题,这些标题公开了可以在C模块中使用的游戏引擎的功能,而没有详细说明它们是如何实现的。这些可能是抽象类或遵循接口的约定。并且它们应该是C所需要的所有内容。所有DirectX内容都可以位于非外部使用的私有文件中。

答案 1 :(得分:1)

预编译的标题应该从不向库的用户公开。它们是图书馆实施的细节;而已。 PCH是.cpp文件包含的东西;它们永远不应该包含在头文件中。

请记住:头文件应仅包含头文件所需的内容,以便进行编译。

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

这不会影响项目A使用PCH来改善编译时间的能力。 DirectX标头包含防护装置,因此不会多次包含它们。将它们包含在项目A的接口头中没有任何成本。

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

项目B使用项目A.但是,正如您所描述的那样,项目B不会将项目B的任何用户暴露给项目A或DirectX。也就是说,项目B使用项目A的事实是项目B的实施细节,因此不应向项目B的用户公开。

因此,项目B的接口标题(项目B的用户使用的标题)不包含项目A或DirectX中的任何内容。因此,使用项目B的项目C将不包括它们。

答案 2 :(得分:0)

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