认为
我们有 c++ 项目(静态)库“A”,它使用 DirectX 头文件作为预编译头文件来实现基本图形引擎。
我们有项目(静态)库“B”,它使用“A”头文件作为预编译头文件来实现游戏引擎
我们有 c++ 项目“C”,它使用两个以前的项目来实现一个游戏
现在我的问题是:
项目“C”有什么办法只包括项目“B”而不包括(DirectX 标头和“A”标头)?
或者另一方面
有没有办法将(DirectX 和项目'A')嵌入到项目'B'?
坦克
认为
我们有 c++ 项目(静态)库“A”,它使用 DirectX 头文件作为预编译头文件来实现基本图形引擎。
我们有项目(静态)库“B”,它使用“A”头文件作为预编译头文件来实现游戏引擎
我们有 c++ 项目“C”,它使用两个以前的项目来实现一个游戏
现在我的问题是:
项目“C”有什么办法只包括项目“B”而不包括(DirectX 标头和“A”标头)?
或者另一方面
有没有办法将(DirectX 和项目'A')嵌入到项目'B'?
坦克
只需确保项目 B 有一些干净的接口标头,这些标头公开了可以从 C 模块中使用的游戏引擎的功能,而无需提供任何详细信息它们是如何实现的。这些可能是抽象类或遵循接口的约定。它们应该是 C 需要包含的所有内容。所有 DirectX 内容都可以位于不供外部使用的私有文件中。
预编译的头文件永远不应该暴露给库的用户。它们是库实现的细节;而已。PCH 是 .cpp 文件包含的内容;它们永远不应该包含在头文件中。
请记住:头文件应仅包含该头文件绝对需要的内容才能编译。
让我们举个例子。项目 A 使用 DirectX。因此,项目 A 中的 .cpp 文件包括一个包含 DirectX 标头的 PCH。现在,如果项目 A 的接口使用 DirectX 对象和类型,那么项目 A接口标头(项目 A 的用户使用的那些)将需要包含 DirectX 标头。
这不会影响项目 A 使用 PCH 来改进编译时间的能力。DirectX 标头具有包含保护,因此它们不会被包含多次。将它们包含在项目 A 的接口标头中不需要任何成本。
使用项目 A 的项目 B 将拥有自己的 PCH 文件。此 PCH 将包括 DirectX 和 Project A 的标头。因此,在项目 A 的标头中包含 DirectX 不会影响项目 B 的构建时间。
项目 B 使用项目 A。但是,正如您所描述的,项目 B 不会将项目 B 的任何用户暴露给项目 A 或 DirectX。也就是说,项目 B 使用项目 A 的事实是项目 B 的一个实现细节,因此它不应该暴露给项目 B 的用户。
因此,项目 B 的接口标头(项目 B 的用户使用的标头)不包含来自项目 A 或 DirectX 的任何内容。因此,使用项目 B 的项目 C 将不包括它们。
由于 B 项目包含/链接到项目 A,因此无需在项目“C”中包含“A”。项目 B 将包含项目 A 中的所有内容,因此项目 C 将包含所有 A 和 B。