.c vs .cc vs. .cpp vs .hpp vs .h vs .cxx .c是C语言源文件的扩展名,.cc和.cpp是C++语言源文件的扩展名,.hpp是C++头文件的扩展名,.h是C和C++的头文件的扩展名,.cxx是C++源文件的扩展名。

315
可能的重复问题: *.h或*.hpp用于类定义 .cc和.cpp文件后缀有什么区别? 我曾经认为: .h文件是C和C++的头文件,通常只包含声明。 .c文件是C源代码。 .cpp文件是C++源代码(也可以是C源代码)。
然后出现了像.hpp、.cc和.cxx这样的文件,我完全搞混了...这些文件之间有什么区别?什么时候使用这些“新”的文件?

5
为了符合makefile惯例(参见http://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html),我更喜欢使用`.cxx`而非`.cpp`。请注意,我的意思是保持一致性,不是改变代码的含义。 - Christoph
8
我同意Christoph的观点。很长一段时间我以为Makefiles中的CPPFLAGS是用来将编译器标志传递给C++编译器(而不是C编译器)。实际上,CPPFLAGS传递的是预处理器标志,这意味着它可能也会影响你的C代码。最终,我学到了CXXFLAGS才是正确的Makefile变量,用于仅向C++编译器传递标志。 - jschultz410
2
@Christoph 反驳:为 .cc.C.cpp 制定隐式规则的同时,不要为 .cxx 制定规则。https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html#Catalogue-of-Rules - Jed
1
我认为这个问题不应该被关闭为重复。标题上写着“这个问题已经有了答案”,但下面没有任何答案。只有“可能的重复项”,其中没有直接比较.hpp.cpp的内容。 - Elijah Mock
6个回答

376

历史上,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用于相同的目的。


6
关于.ii的说明:.i.ii是GCC默认使用的扩展名,可能也是其他编译器用于C和C++预处理源代码的扩展名,不一定是内联头文件定义。如果您使用-E选项要求GCC对源代码进行预处理,则会生成一个.i.ii文件,然后可以将其输入到gcc -c中进行编译。 - Adam Rosenfield

68

这些扩展名并不是新的,它们已经存在很久了。 :-)

当 C++ 刚出现时,有些人想要在源代码文件中加上 .c++ 扩展名,但是这在大多数文件系统上都无法使用。所以他们尝试了一些接近的变体,比如 .cxx 或者 .cpp。

其他人则考虑到语言名称,将 .c 加上一个字母后缀,例如 .cc 或者某些情况下的 .C。但并没有得到广泛使用。

还有一些人认为如果源代码是 .cpp,头文件应该是 .hpp 以匹配。这种做法有一定的成功率。


33

这其实并不重要。
如果你把 .c 文件交给 C++ 编译器,它会作为 C++ 代码进行编译。而 .cc/.cxx 只是一些编译器用来替代 .cpp 的备选文件扩展名。

.hpp 是为了区分头文件中的 C 和 C++ 差异而设计的。常见的用法是在 .hpp 中加上必要的 cpp 包装或命名空间,然后再包含 .h 文件,以便将 C 库暴露给 C++ 和 C。


我还要指出,在类UNIX系统上,.cc更常见(但并不是“标准”),而在Windows系统上,.cpp更为常见。至少在我的观察中是这样的。 - Daniel Gallagher
我认为Sun的C++编译器使用.cc扩展名,但我找不到相关参考资料。 - Martin Beckett

27

我使用 ".hpp" 作为 C++ 的头文件后缀,使用 ".h" 作为 C 语言的头文件后缀。 ".hpp" 后缀提醒我这个文件包含的是 C++ 语言中的声明,而这些声明在 C 语言中是无效的,例如 "class" 声明。


10
谈到.hpp扩展名,我发现当人们需要知道这个头文件包含的是C++而不是C时,例如使用命名空间或模板等,当他们看到该文件时,它很有用,因此他们不会尝试将其输入到C编译器中! 我还喜欢将不仅包含声明还包含实现的头文件命名为.hpp文件,例如包含模板类的头文件。虽然这只是我的观点,当然不一定正确! :)

8

通常,.c和.h文件用于C或兼容C的代码,其他一切都是C++。

许多人喜欢使用一致的C++文件配对方式:.cpp与.hpp,.cxx与.hxx,.cc与.hh等。 我个人偏爱.cpp和.hpp。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接