3

我们可以包含 <iostream> 并且我们不关心它的 cpp 文件,但是为什么我们不能对我们自己的类做同样的事情呢?

因此,如果我的项目使用 50 个自定义类,我不仅必须拥有 50 个包含,而且还必须与它们一起编译/链接 50 个 cpp 文件(并使项目树混乱)。

问:有什么方法可以像使用标准库一样使用自定义标头?

换句话说,是否有一种洁净的方式,这样我们就不必在项目中添加所有这些 cpp 文件。我只想包含 ClassSnake.hpp,它又知道在哪里可以找到 ClassSnake.cpp,它链接到 ClassVector.hpp,它知道如何找到 ClassVector.cpp ...所有这些都在自动菊花链中,而无需我显式添加那些 cpp 文件在我的项目树中。

编辑:我不太担心重新编译 cpp 文件。我的问题是必须记住哪个类在内部链接到哪个其他类,以便我可以正确地将所有那些隐藏的 cpp 文件包含在项目树中......并使树混乱。

在此处输入图像描述

4

6 回答 6

4

并不真地。

您缺少的是您的编译器工具链已经编译<iostream>了头文件中没有的位需求。

您的编译器(实际上是链接器)只是隐式链接此代码,而无需您指定它。

如果您想稍微清理一下您的项目树,您可以创建其他项目,这些项目是供一个主要项目使用的代码库。

于 2013-05-15T18:46:13.507 回答
0

首先,如果您使用诸如 make 之类的系统,那么它将识别出 .cpp 文件没有更改,因此编译器不必重建目标文件。

您还可以创建自己的静态/共享库。执行此操作的方法取决于平台。如果你沿着这条路走,那么你所需要的只是头文件和库。

请谷歌了解如何构建如何为您的特定平台制作库。

于 2013-05-15T18:53:41.613 回答
0

标头(通常)不提供事物(函数、类)的实现,如果您要使用它们,它们必须在某个地方实现。

当您包含自己的标头时,您会包含自己的源代码以提供实现。那里够直了。

当您包含标准头文件(例如 iostream)时,实现在您包含的库中(或者是因为编译器只是执行它而隐式地执行,或者通过编译器/链接器选项显式地执行)。

于 2013-05-15T18:47:08.140 回答
0

作为对 Collin 答案的扩展,您始终可以将“共享”代码卸载到共享库,然后在其他项目中引用头文件和 lib 文件。lib 文件只会在链接器阶段发挥作用,因为所有其他讨厌的.cpp文件都已编译。

如果这只是一个没有其他共性的自封闭项目,那么您将不得不接受您必须提供实现的事实:)

于 2013-05-15T18:48:55.813 回答
0

实际上,如果您有一个不错的构建过程,那么未更改的 cpp 文件将不会再次编译。他们只需要被链接。如果您不希望这样,您需要创建自己的库。是可以的,只是稍微多一些。

编辑:如果您想创建自己的库,这个问题可能会对您有所帮助。

因此,回答已编辑的问题:是的,您可以避免在项目中包含所有这些 cpp 文件,但前提是您不想更改它们。在这种情况下,您可以只创建一个静态或动态库,并且只需要用于链接的符号。在这种情况下,您将创建另一个项目来将所有内容编译到这样的库中。

于 2013-05-15T18:49:06.920 回答
-1

像“iostream”这样的 STL 代码由模板组成,在创建模板实例之前实际上不会生成任何代码。

于 2013-05-15T18:47:34.513 回答