.c vs .cc vs .cpp vs .hpp vs .h vs .cxx

可能重复:
* .h或* .hpp用于您的类定义
正确的C ++代码文件扩展名? .cc vs .cpp

我曾经认为它曾经是这样的:

  • .h文件是C和C ++的头文件,通常只包含声明。
  • .c文件是C源代码。
  • .cpp文件是C ++源代码(也可以是C源代码)。

那么像.hpp.cc.cxx这样的文件就出现了,我完全糊涂了…那些文件有什么不同? 你什么时候使用“新”的?

从历史上看,用于C ++的第一个扩展是.c.h ,与C完全一样。这引起了实际问题,尤其是.c ,这使得构build系统无法轻易区分C ++和C文件。

在其上开发了C ++的Unix,具有区分大小写的文件系统。 所以一些C ++文件使用.C 。 其他使用.c++ .cc.cxx.C.c++有问题,在其他文件系统上不可用,并且它们的使用很快就会丢失。 DOS和Windows C ++编译器倾向于使用.cpp ,并且其中一些使得select难以(如果不是不可能的话)configuration。 可移植性的考虑使得这种select最为常见,甚至在MS-Windows之外。

标题使用了相应的.H.h++ .hh.hxx.hpp 。 但是与主文件不同的是, .h仍然是C ++最stream行的select,即使它不允许知道头文件是否可以包含在C语言中。 标准头文件现在根本没有扩展名。

此外,有些使用.ii.ixx.ipp.inl作为提供内联定义的标题,使用.txx.tpp.tpl作为模板定义。 这些包含在提供定义的头文件中,或者在需要的上下文中手动包含。

编译器和工具通常不关心使用什么扩展,但使用与C ++相关的扩展可以避免跟踪如何configuration它们,以便正确识别使用的语言。

2017编辑:Visual Studio的实验模块支持将.ixx识别为模块接口的默认扩展,clang ++正在为同一目的识别.c++m.cppm.cxxm

这些扩展不是真的新,他们是老的。 🙂

当C ++是新的时候,有些人希望对源文件有一个.c ++扩展名,但是在大多数文件系统上都不行。 所以他们尝试了一些与.cxx或.cpp相似的东西。

其他人想到了语言名称,并在某些情况下“递增”.c来获得.cc或甚至.C。 没有那么多。

有些人认为,如果源是.cpp,头应该是.hpp匹配。 中等成功。

这真的没关系。
如果将.c提供给c ++编译器,它将以cpp编译,.cc / .cxx只是某些编译器使用的.cpp的替代方法。

.hpp是一个试图区分有明显的c和c ++差异的头文件。 一个常见的用法是使.hpp具有必要的cpp包装器或命名空间,然后包含.h以将ac库展示给c和c ++。

C ++头文件使用“.hpp”,C语言头文件使用“.h”。 “.hpp”提醒我该文件包含对C语言无效的C ++语言语句,比如“class”声明。

在谈到.hpp扩展时,我发现它很有用,当人们应该知道这个头文件包含C ++而不是C时 ,比如使用命名空间或者模板等,直到他们看到这些文件,所以他们不会尝试提供它到一个C编译器! 而且我也喜欢将不仅包含声明而且包含实现的头文件命名为.hpp文件。 像包含模板类的头文件。 虽然这只是我的意见,当然它不应该是正确的! 🙂

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

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