繁体   English   中英

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

[英]What is the difference between a .cpp file and a .h file?

因为我已经制作了 .cpp 文件,然后将它们传输到 .h 文件中,所以我能找到的唯一区别是你不能 #include .cpp 文件。 我缺少什么区别吗?

C++ 构建系统(编译器)不知道有什么区别,所以它都是一种约定。

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

这就是 .h 文件被 #included 的原因——我们包括声明。

.cpp 文件是编译单元:它是将被编译的真正源代码文件(在 C++ 中)。

.h(头文件)文件是将被虚拟复制/粘贴到 #include 预编译器指令出现的 .cpp 文件中的文件。 一旦将头代码插入到 .cpp 代码中,就可以开始编译 .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后缀命名的约定并不是真正需要的。 人们总是可以告诉一个好的编译器如何处理某个文件,而不管它的文件名后缀( -x <file-type> for gcc. Like -x c++ )。

源文件将包含在整个程序中只能出现一次的定义。 因此,如果您在某处包含一个源文件,然后将该文件的编译结果与源文件本身链接在一起,那么您当然会得到链接器错误,因为这些定义现在出现了两次:一次在包含源文件,然后在包含它的文件中。 这就是您在包含.cpp文件时遇到问题的原因。

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

它们分开的原因是因为 .h 文件没有被编译成二进制代码,而 .cpp 文件是。 以图书馆为例。 假设您是作者并且您不希望它是开源的。 因此,您将编译后的二进制库和头文件分发给您的客户。 这使他们可以轻松查看有关他们可以使用的库类的所有信息,而无法查看您是如何实现这些方法的。 它们更适合使用您的代码而不是编译器的人。 正如之前所说:这是惯例。

我知道声明和定义之间的区别。

然而:

  • CPP 文件包括它所包含的任何头文件的定义(因为 CPP 和头文件一起成为一个“翻译单元”)
  • 一个头文件可能包含在多个 CPP 文件中
  • 链接器通常不会喜欢在多个 CPP 文件中定义的任何内容

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

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

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

其他人已经提供了很好的解释,但我认为我应该澄清各种扩展之间的区别:

Source Files for C: .c
  Header Files for C: .h

  Source Files for C++: .cpp
  Header Files for C++: .hpp

当然,正如已经指出的那样,这些只是惯例。 编译器实际上并不关心它们——这纯粹是为了编码器的利益。

按照惯例,.h 文件会被其他文件包含,并且不会被它们自己直接编译。 .cpp 文件 - 再次,按照惯例 - 编译过程的根源; 它们直接或间接包含 .h 文件,但通常不包含 .cpp 文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM