包含.cpp文件和.h文件的区别(cpp文件内容相同)?

3

我最近开始从基础学习 C++,以下问题让我很困惑:

假设我有一个头文件(test.h,仅包含声明)和一些源文件(source.cpp),程序产生了一些结果。

如果我将该头文件的内容复制到一个 .cpp 文件(testcpp.cpp)中,并将其包含在 source.cpp 中:

这种情况下,我不明白这会产生什么区别?

我不会在 makefile 中包含这个 testcpp.cpp 文件

我看过一些类似的帖子,但是没有清楚的想法!!!

我已经学会了如何正确使用头文件和 cpp 文件,并在项目中正确地使用它们,请针对这种情况作出回答(我知道这样做会增加混乱,但只是想知道)。这样做是否会产生任何差异,或者这只是每个人都遵循的常规做法?


1
源文件不适合包含在内。你基本上永远不应该包含源文件。相反,你应该将其编译成目标文件,并将其链接到其他目标文件以生成可执行文件。 - NathanOliver
3
#include "whatever"的作用是将文件whatever中的所有文本复制到此处。 - user7860670
1
假设您的头文件仅包含声明,而所有定义都在源文件中,则存在差异。您绝不能为一个函数提供多个定义。通过包含源文件,您可能会冒重复包含它的风险(在另一个文件中第二次包含),这将导致链接失败。多个声明是可以的,这就是为什么您可以随意包含头文件的原因。 - François Andrieux
1
@infiniteloop 是的,但那样它就不再是头文件了,而是源文件。头文件应该是可以自由包含的文件。请注意,有一些例外情况,其中在头文件中包含实现是可以的,例如 inline 和模板函数定义。请参见 ODR - François Andrieux
1
不建议在头文件中包含 .c 或 .cpp 文件,这可能会导致一些神秘的编译错误。我说的是基于经验的建议,也是我曾经收到的同样建议。 - ytobi
显示剩余10条评论
3个回答

3

它并不会改变任何东西。使用*.h或*.cpp或*.asdasd后缀只是一种约定,只要它本身没有被编译就可以了。

有些项目将头文件的扩展名设置为.hxx,源文件设置为.cc。

为了与你一起工作的程序员的利益,请遵循常见的约定,不要将头文件代码放在.cpp文件中。


在这种情况下,我可以将任何文件(带有任何扩展名)添加到具有适当cpp代码的make文件中吗? - infinite loop
1
@infiniteloop 抱歉,你能换个说法吗?我不确定我理解了。 - Federico klez Culloca
在 makefile 中,当指定源文件时,我可以使用任何扩展名(.fsfs、.xxx)而不是 .cpp 扩展名来提供我的源文件吗?(文件内容将是有效的 cpp 内容,在两种情况下都相同) - infinite loop
@infiniteloop,你可以这样做,但正如user2079303所解释的那样,不要这样做,这会让人感到困惑。 - Federico klez Culloca

3

有什么区别吗?

头文件的扩展名对任何事情都没有影响。你可以把文件命名为test.mpg.test或者只是test(显然需要修改include指令),结果也会一样。扩展名只是为了让程序员更方便,而不是为了工具链考虑。

然而,除了.h、.hpp或者其他约定俗成的扩展名之外,给它任何其他的扩展名都是个坏主意。如果你把它命名为.mpg,人们会认为它是一个视频,而且可能会在媒体播放器中尝试播放它,却没意识到它其实是一个头文件。如果你将其命名为.cpp,人们会认为它是一个源文件,可能会尝试编译或者增加定义等操作。

使用预处理器包含一个文件,本质上就是把一个文件的内容复制到另一个文件中,除此之外,并没有其他的操作。所有关于它们的一切都只是惯例。

在makefile中,当指定源文件时,我能使用任何扩展名(.fsfs、.xxx)而不是.cpp扩展名吗?

从技术上来讲,是可以的。但是编译器通常使用源文件扩展名来检测语言类型,在这种情况下它们将无法执行此操作,所以你必须明确指定。


2

#include只是将您包含的文件复制并粘贴到当前文件中。文件名一点也不重要-如果您喜欢,可以将其命名为“foo.exe”;只要它在包含它的上下文中包含有效的源代码,一切都很好(但请不要使用非传统的名称,这只会使人们感到困惑)。


1
(but please don't) - Lightness Races in Orbit
@BoundaryImposition 同意。非常同意。 - Jesper Juhl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接