.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。