然后出现了像.hpp、.cc和.cxx这样的文件,我完全搞混了...这些文件之间有什么区别?什么时候使用这些“新”的文件?
历史上,C++ 的第一个扩展名与 C 相同,分别是 .c
和 .h
。这会带来实际问题,特别是 .c
扩展名会阻止构建系统轻松区分 C++ 文件和 C 文件。
Unix 是 C++ 开发的平台,具有区分大小写的文件系统。因此,一些人使用 .C
作为 C++ 文件的扩展名;其他人则使用 .c++
、.cc
和 .cxx
。但是,.C
和 .c++
在其他文件系统上不可用,并且很快就退出了使用。DOS 和 Windows 的 C++ 编译器倾向于使用 .cpp
,其中一些使选择变得困难,甚至不可能进行配置。出于可移植性的考虑,这种选择成为最常见的选择,即使在 MS-Windows 之外也是如此。
头文件相应地使用了 .H
、.h++
、.hh
、.hxx
和 .hpp
。但与主文件不同的是,即使存在着无法确定头文件是否可以在 C 上下文中包含的缺点,.h
仍然是 C++ 中受欢迎的选择。标准头文件现在没有扩展名。
此外,一些人使用 .ii
、.ixx
、.ipp
和 .inl
作为提供内联定义的头文件的扩展名,使用 .txx
、.tpp
和 .tpl
作为模板定义的扩展名。这些要么包含在提供定义的头文件中,要么手动加入必要的上下文中。
编译器和工具通常不关心使用哪个扩展名,但是使用与 C++ 相关联的扩展名可以避免需要跟踪如何配置它们以正确识别所使用的语言。
2017年的更新:Visual Studio实验性模块支持默认将.ixx
识别为模块接口的扩展名,clang++则将.c++m
、.cppm
和.cxxm
用于相同的目的。
.ii
的说明:.i
和.ii
是GCC默认使用的扩展名,可能也是其他编译器用于C和C++预处理源代码的扩展名,不一定是内联头文件定义。如果您使用-E
选项要求GCC对源代码进行预处理,则会生成一个.i
或.ii
文件,然后可以将其输入到gcc -c
中进行编译。 - Adam Rosenfield这些扩展名并不是新的,它们已经存在很久了。 :-)
当 C++ 刚出现时,有些人想要在源代码文件中加上 .c++ 扩展名,但是这在大多数文件系统上都无法使用。所以他们尝试了一些接近的变体,比如 .cxx 或者 .cpp。
其他人则考虑到语言名称,将 .c 加上一个字母后缀,例如 .cc 或者某些情况下的 .C。但并没有得到广泛使用。
还有一些人认为如果源代码是 .cpp,头文件应该是 .hpp 以匹配。这种做法有一定的成功率。
这其实并不重要。
如果你把 .c 文件交给 C++ 编译器,它会作为 C++ 代码进行编译。而 .cc/.cxx 只是一些编译器用来替代 .cpp 的备选文件扩展名。
.hpp 是为了区分头文件中的 C 和 C++ 差异而设计的。常见的用法是在 .hpp 中加上必要的 cpp 包装或命名空间,然后再包含 .h 文件,以便将 C 库暴露给 C++ 和 C。
我使用 ".hpp" 作为 C++ 的头文件后缀,使用 ".h" 作为 C 语言的头文件后缀。 ".hpp" 后缀提醒我这个文件包含的是 C++ 语言中的声明,而这些声明在 C 语言中是无效的,例如 "class" 声明。
通常,.c和.h文件用于C或兼容C的代码,其他一切都是C++。
许多人喜欢使用一致的C++文件配对方式:.cpp与.hpp,.cxx与.hxx,.cc与.hh等。 我个人偏爱.cpp和.hpp。
.cc
、.C
和.cpp
制定隐式规则的同时,不要为.cxx
制定规则。https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue-of-Rules - Jed.hpp
和.cpp
的内容。 - Elijah Mock