.cpp文件和.h文件有什么区别?

因为我已经做了.cpp文件,然后将它们转换成.h文件,唯一的区别是我可以find的是,你不能#include .cpp文件。 我有什么不同吗?

C ++构build系统(编译器)是没有区别的,所以这都是一个惯例。

约定是.h文件是声明,.cpp文件是定义。

这就是为什么.h文件被包含 – 我们包含声明。

.cpp文件是编译单元:它是将被编译的实际源代码文件(以C ++语言编写)。

.h(头文件)文件是将被虚拟复制/粘贴在#include预编译器指令出现的.cpp文件中的文件。 一旦标题代码插入到.cpp代码中,就可以开始编译.cpp。

我知道宣言和定义之间的区别。

鉴于:

  • 一个CPP文件包含它包含的任何头文件的定义(因为CPP和头文件一起成为一个单独的“翻译单元”)
  • 头文件可能包含多个CPP文件
  • 链接器通常不会像在一个以上的CPP文件中定义的任何东西

因此,头文件中的任何定义都应该是内联或静态的。 头文件还包含由多个CPP文件使用的声明。

定义既不是静态也不是内联放置在CPP文件中。 此外,只有一个CPP文件中需要的任何声明通常放置在该CPP文件本身内,而不是在任何(可共享的)头文件中。

.h文件或头文件用于列出类声明中可公开访问的实例variables和方法。 .cpp文件或实现文件用于实际实现这些方法并使用这些实例variables。

他们分开的原因是因为.h文件没有被编译成二进制代码而.cpp文件是。 以图书馆为例。 假设你是作者,你不希望它是开源的。 所以你把编译好的二进制库和头文件分发给你的客户。 这使得他们可以很容易地看到他们可以使用的图书馆类的所有信息,而无法看到你是如何实现这些方法的。 他们更多的是使用你的代码而不是编译器的人。 正如之前所说:这是公约。

标题( .h.hpp ,…)文件包含

  • 类定义( class X { ... };
  • 内联函数定义( inline int get_cpus() { ... }
  • 函数声明( void help();
  • 对象声明( extern int debug_enabled;

源文件( .c.cpp.cxx )包含

  • 函数定义( void help() { ... }void X::f() { ... }
  • 对象定义( int debug_enabled = 1;

但是,以.h后缀和源文件命名的头文件以.cpp后缀命名的约定实际上并不是必需的。 总是可以告诉一个好的编译器如何处理某个文件,而不pipe其文件名后缀(gcc的-x <file-type> ,就像-x c++ )。

源文件将包含在整个程序中只能出现一次的定义。 所以,如果你在某个地方包含了一个源文件,然后将该文件的编译结果链接到一个源文件本身,那么你当然会得到链接器错误,因为你现在已经出现了两次这样的定义:包括源文件,然后在包含它的文件中。 这就是为什么你有包括.cpp文件的问题。

其他人已经提供了很好的解释,但我想我应该澄清各种扩展之间的差异:

   C:.c的源文件
   Header Files for C:.h

   C ++的源文件:.cpp
  用于C ++的头文件:.hpp

当然,正如已经指出的那样,这只是公约。 编译器实际上并没有注意到它们 – 这纯粹是为了编码器的利益。

一个好的经验法则是“.h文件应该有多个源文件使用的声明,但没有运行的代码。

按照惯例,.h文件被其他文件包含,并且从不直接编译。 .cpp文件也是按惯例 – 编译过程的根源; 它们直接或间接包含.h文件,但一般不包含.cpp文件。