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

时间:2011-03-02 18:05:00

标签: c++ c

  

可能重复:
  *.h or *.hpp for your class definitions
  Correct C++ code file extension? .cc vs .cpp

我曾经认为过去是这样的:

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

然后出现.hpp.cc.cxx这样的文件,我完全糊涂了......这些之间有什么区别?你什么时候使用“新”的?

6 个答案:

答案 0 :(得分:273)

从历史上看,用于C ++的第一个扩展名是.c.h,与C完全相同。这会导致实际问题,尤其是.c,它不允许构建系统轻松实现区分C ++和C文件。

Unix上已经开发了C ++,它具有区分大小写的文件系统。因此有些人使用.C来表示C ++文件。其他已使用.c++.cc.cxx.C.c++存在这样的问题:它们在其他文件系统上不可用,并且它们的使用很快就会丢失。 DOS和Windows C ++编译器倾向于使用.cpp,其中一些编译器使得选择很难(如果不是不可能的话)进行配置。可移植性考虑使得该选择最常见,甚至在MS-Windows之外。

标题使用了相应的.H.h++.hh.hxx.hpp。但与主文件不同,.h至今仍然是C ++的流行选择,即使它的缺点是它不允许知道标头是否可以包含在C上下文中。标准标题现在根本没有扩展名。

此外,有些人使用.ii.ixx.ipp.inl来提供内联定义和.txx.tpp和{ {1}}用于模板定义。这些要么包含在提供定义的标题中,要么在需要它们的上下文中手动包含。

编译器和工具通常不关心使用哪些扩展,但使用与C ++关联的扩展可以防止需要跟踪如何配置它们以便正确识别所使用的语言。

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

答案 1 :(得分:51)

这些扩展并不是新的,它们已经过时了。 : - )

当C ++是新的时,有些人希望对源文件使用.c ++扩展名,但这在大多数文件系统上都不起作用。所以他们尝试了接近它的东西,比如.cxx或.cpp。

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

有些人认为,如果源是.cpp,那么标题应该是.hpp才能匹配。中等成功。

答案 2 :(得分:26)

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

.hpp是尝试区分存在重大c和c ++差异的头文件。一个常见的用法是.hpp具有必要的cpp包装器或命名空间,然后包含.h以便将c库暴露给c和c ++。

答案 3 :(得分:17)

我对C ++标题使用“.hpp”,对C语言标题使用“.h”。 “.hpp”提醒我该文件包含语句 C ++语言对C语言无效,如此 作为“阶级”声明。

答案 4 :(得分:6)

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

答案 5 :(得分:5)

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

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