包含头文件和 C++ 文件有什么区别?

What's the difference between including a header and a C++ file?

包含头文件(.h 文件)和 C++ 文件(.cpp 文件)有什么区别?当我创建一个 class 时,我创建了一个 .h 文件和一个 .cpp 文件。如果我想使用这个 class 的对象,我是否应该包含这两个文件?在哪些情况下我应该包含 .cpp 文件?

从编译器的角度来看,包含 .cpp.h 文件没有区别。但是 .cpp.h 的内容在一般情况下是不同的。 .cpp 文件用于实现 class、函数、静态对象,.h 文件用于 class 定义。如果将 .cpp 文件包含到另一个 .cpp 文件中,内容会重复,并且会在 link 阶段失败,因为命名冲突。

What's the difference between including a header(.h files) and C++ file(.cpp files)?

假设 .cpp 文件包含一些函数定义,后一个选项通常不适用于常用的构建系统,并以 multiple definition 错误结束,当 .cpp 被多个翻译单位收录。

异常可能是内联了 .cpp 文件中的所有函数定义。

从根本上讲,C/C++ 预处理器只是将在任一文件类型中找到的文本扩展到当前翻译单元中。文件扩展名在这里不起作用。

没有区别。两者都由预处理器作为纯文本处理以连接到单个文件。但是,包含源可能会产生不良结果(variables/functions 的多个定义)。头文件通常由包含保护程序(#ifndef HEADER_H 或 #pragma once)保护,以防止其内容重复。

注意:编译器在预处理后工作(或在编译前调用预处理器)。

叫什么文件,它们的内容是什么,完全是约定俗成的。如果你喜欢混淆别人,你可以称你的头文件为 something.b 和你的源文件为 something.r - 这当然对大多数人来说没有任何用处,有些人可能认为你的文件包含语言 R而不是 C++ 源代码。并且您的编辑器可能不会理解它在名为 .b 的文件中是 C 还是 C++ - 构建工具如 MakesconsCMake 等可能不会理解如何编译你的文件而不是 "told"。 [编译器还会查看文件扩展名以确定它应该编译为 C++ 还是 C,这当然不适用于 "unconventional names"]

重要的不是文件的名称,而是文件实际包含的内容。头文件(大多数人称之为 something.h)文件应该是这样的,它可以在项目中的任何地方和任何次数包含[确实存在例外,其中头文件实际上并不意味着被包含超过一个整个项目中的单个时间 - 例如 version.h 声明了一个描述当前版本号的字符串]。

一个源文件(通常称为something.cpp,通常应该直接传递给编译器进行编译,而不是作为#include "something.cpp"使用。但是,决定内容的是CONTENT this,不是文件的名称。如果你那样使用它们,它只是命名错误的文件。

总结:编译器只是读取传入的源文件,然后"inserts"将#include放入它编译的代码流中,就好像它被粘贴到原始源文件中一样。编译器并不真正关心你的文件名是什么,它们来自哪里,或者它们的内容是什么,只要编译器是 "ok" 整个编译。