C++ 包含.cpp文件和.h文件(在cpp中具有相同的内容)的区别?

C++ 包含.cpp文件和.h文件(在cpp中具有相同的内容)的区别?,c++,visual-c++,C++,Visual C++,我最近开始从基础知识学习cpp,对以下内容感到非常困惑: 假设我有一个头(test.h,它只包含声明)和一些内容以及一些源文件(source.cpp),程序生成了一些结果 如果我已将该头文件的相同内容复制到.cpp文件(testcpp.cpp),并将其包含在source.cpp 在这种情况下,我不明白这有什么区别 (我不会在make文件中包含此testcpp.cpp) 我见过一些类似的线程,但不能得到一个明确的想法 我学习了头文件和cpp文件的用法,并且到目前为止已经在项目中正确地使用了它,请针

我最近开始从基础知识学习cpp,对以下内容感到非常困惑:

假设我有一个头(
test.h
,它只包含声明)和一些内容以及一些源文件(
source.cpp
),程序生成了一些结果

如果我已将该头文件的相同内容复制到.cpp文件(
testcpp.cpp
),并将其包含在
source.cpp

在这种情况下,我不明白这有什么区别

我不会在make文件中包含此
testcpp.cpp

我见过一些类似的线程,但不能得到一个明确的想法


我学习了头文件和cpp文件的用法,并且到目前为止已经在项目中正确地使用了它,请针对这种情况回答(我知道这样做会增加混乱,但我只是想知道)。这样做会有什么不同吗?或者这只是每个人都遵循的一种常见做法?

它不会改变任何事情。无论您使用*.h或*.cpp或*.asdasd后缀,只要它不自行编译,这只是一种惯例

有些项目对头文件使用.hxx扩展名,对源文件使用.cc扩展名


为了与您一起工作的程序员同事的利益,请遵守常见惯例,不要在.cpp文件中放入头代码。

\include
只需将包含的文件复制粘贴到当前文件中即可。文件的名称一点也不重要——如果您愿意,可以将其命名为“foo.exe”;只要它在包含它的上下文中包含有效的源代码,一切都很好(但请不要使用非常规的名称,这只会让人感到困惑)

这有什么区别

头文件的扩展名对任何内容都没有影响。您也可以将文件命名为
test.mpg
.test
或只是
test
(显然更改include指令),而且它也同样有效。扩展是为了程序员的利益,而不是为了工具链

然而,将其命名为.h、.hpp或任何您的惯例以外的名称是一个坏主意。如果你把它命名为.mpg,人们会认为它是一个视频,而没有意识到它是一个头文件,尝试在媒体播放器中播放它。如果你把它命名为.cpp,人们会认为它是一个源文件,可能会试图编译它,或者在其中添加定义

在预处理器中包含一个文件在技术上只是将一个文件的内容复制到另一个文件中。不多也不少。关于他们的一切都是惯例


在makefile中,当指定源文件时,我是否可以为源文件提供任何扩展名(.fsfs、.xxx)而不是.cpp扩展名


从技术上讲是的,但是编译器通常使用源文件扩展名来检测在这种情况下无法检测的语言,因此您必须明确指定它。

源文件不包括在内。您基本上不应该包含源文件。相反,您应该将其编译成一个对象文件,并将其链接到其他对象文件以使其成为可执行文件。
\include“whatever”
的作用类似于“复制文件
whatever
中的所有文本”。@infinitelop
\include
不关心文件类型,假设你的头文件只包含声明,并且你的所有定义都在源文件中,这是有区别的。一个函数不能提供多个定义。通过包含源文件,您可能会将其包含两次(第二次包含在另一个文件中),这将导致链接失败。多个声明都可以,这就是为什么您可以随心所欲地包含标题。@InfiniteLop是的,但它将不再是标题,而是源文件。假定头是可以自由包含的文件。请注意,有些例外情况下可以在头中包含实现,例如
inline
和模板函数定义。请参阅。在这种情况下,我可以在make文件中添加任何内容(具有任何扩展名的文件)并在其中包含正确的cpp代码吗?@InfiniteLop抱歉,您可以重新措辞吗?我不确定我是否理解。在makefile中,当指定源文件时,我可以给我的源文件提供任何扩展名(.fsfs,.xxx)而不是.cpp扩展名(文件中的内容将是有效的cpp内容,在这两种情况下都是相同的)@InfiniteLop您可以,但正如用户2079303所解释的,不要这样做,这会让人困惑。(但请不要这样做)@我同意。非常地