[英]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 文件本身中,而不是任何(可共享的)头文件中。
一个好的经验法则是“.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.