C ++如何在不编译cpp文件的情况下包含类头文件?

时间:2013-05-15 18:42:37

标签: c++ header include

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

因此,如果我的项目使用50个自定义类,不仅需要包含50个自定义类,还必须编译/链接50个cpp文件(并使项目树混乱)。

问:有没有办法像我们使用标准库那样使用自定义标头?

换句话说,有一种犹太方式,所以我们不必在项目中添加所有这些cpp文件。我想只包括ClassSnake.hpp,而ClassSnake.hpp又知道在哪里可以找到ClassSnap.pp,它连接到ClassVector.hpp,它知道如何在自动菊花链中找到ClassVector.cpp ......所有这些都不需要我显式添加那些cpp文件在我的项目树中。

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

enter image description here

6 个答案:

答案 0 :(得分:4)

不是。

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

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

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

答案 1 :(得分:0)

标题不(通常)提供事物(函数,类)的实现,如果要使用它们,它们必须在某处实现。

当您包含自己的标头时,您需要包含自己的源以提供实施。在那里直接前进。

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

答案 2 :(得分:0)

作为Collin答案的延伸,您可以随时将“共享”代码卸载到共享库,然后引用其他项目中的头文件和lib文件。 lib文件只会在链接器阶段播放,因为所有其他令人讨厌的.cpp文件已经被编译。

如果这只是一个没有其他共性的自封闭项目,那么你只需要了解必须提供实现的事实:)

答案 3 :(得分:0)

实际上,如果你有一个不错的构建过程,那么没有改变的cpp文件将不再被编译。他们只需要联系起来。如果你不想要,你需要创建自己的库。它可以完成,只是涉及更多。

编辑:This question可能会帮助您创建自己的库。

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

答案 4 :(得分:0)

首先,如果你使用像make这样的系统,那么它将识别.cpp文件没有改变,因此编译器不必重建目标文件。

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

请Google了解如何为您的特定平台构建库。

答案 5 :(得分:-1)

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