C++代码文件扩展名?. cc和. cpp有什么区别

我看到C++代码同时保存为.cc.cpp文件。这两者之间有区别吗?

google风格指南似乎暗示.cc,但没有提供解释。

我主要关注Linux系统的程序。

499481 次浏览

归根结底,这并不重要,因为C++编译器可以处理两种格式的文件。如果这是您团队中的一个真正问题,抛硬币并继续进行实际工作。

据我所知,.cpp是C++的推荐扩展。有些人甚至建议C++头文件使用.hpp,只是为了与C区分开来。

虽然编译器不在乎你做什么,但这是个人偏好。

只需遵循项目/团队使用的约定。

使用的其他文件扩展名包括.cxx.C(大写C)。我相信Bjarne Stroustrup最初使用.C.cpp是C预处理器的名称,所以不幸的是它也用于C++。

你使用哪个扩展并不重要。选择你更喜欢的那个,只要与命名保持一致。我知道这个命名约定的唯一例外是我无法制作WinDDK(或者现在是WDK?)来编译.cc文件。Linux,尽管这几乎不是问题。

另一个选项是.cxx,其中x应该是正旋转45°。

Windows,Mac和Linux都支持.c++,所以我们应该使用它。

我个人从未在我参与的任何项目中见过.cc,但编译器不会在意所有的技术性。

谁会关心开发你的源代码的开发人员,所以我的经验法则是选择你的团队感到满意的东西。如果你的“团队”是开源社区,选择一些非常常见的东西,其中.cpp似乎是最喜欢的。

与大多数风格约定一样,只有两件事很重要:

  1. 尽可能在你使用的东西上保持一致。
  2. 不要设计任何依赖于正在使用的特定选择的东西。

这些似乎相互矛盾,但它们都有自己的价值。

.C.cc似乎是我见过的(少数)面向Unix的C++程序的标准。我自己一直使用.cpp,因为我只在Windows上工作,这一直是那里的标准。

我个人推荐.cpp,因为…它代表“C Plus Plus”。当然,文件扩展名是首字母缩略词是至关重要的,但是如果这个理由证明不够令人信服,其他重要的事情是不使用Shift键(它排除了.C.c++)和尽可能避免正则表达式元字符(它排除了.c++-不幸的是,你当然无法真正避免.。)。

这并不排除.cc,所以即使它并不代表任何东西(或者它?),它也可能是面向Linux代码的不错选择。

我个人使用.cc扩展名用于实现文件,.hh用于标题,.inl用于内联/模板。

如前所述,这主要是品味问题。

从我所看到的.cc似乎更像是“面向开源项目”,因为它在一些伟大的开源软件编码风格中被建议,而.cpp似乎更像是Windowish。

编辑

如前所述,这是"从我所看到的",它可能是错误的。 只是我参与的所有Windows项目都使用了.cpp,而很多开源项目(主要是像unix一样的)使用了.cc

使用.cc的示例编码样式:

有些人说.cc不代表任何东西?也许吧。C++以“带类的C”开始生活。

诚然,.cc.cpp也是大多数Unix系统上的命令名(分别为c编译器和c预处理器)。

我只使用.cpp,但我是从Windows开始的。.cc更像是一个Unix约定,尽管我在那里看到它的次数越来越少。GNU make有.cpp的规则,所以这可能是首选,它默认情况下在Windows和其他所有设备上都可以工作。另一方面,现代C++根本没有为头文件使用扩展名,我真的不喜欢这样。我所有的项目都使用.h作为头文件,它们通过extern "C"和测试__cplusplus尽可能地支持C和C++。

我分别使用. C和. h作为源代码和标头。这种选择的一个好处是,在命令行上,使用*.[Ch]选择所有代码文件很容易。在不区分大小写的文件系统中使用.C可能是一个问题,但是如果你在同一个目录中有foo.cfoo.C,你应该得到你得到的东西:)

GNU GCC将以下所有文件识别为C++文件,并且将使用C++编译,无论您是通过gcc还是g++调用它:.C.cc.cpp.CPP.c++.cp.cxx

请注意.C-GCC中的case问题,.c是一个C文件,而.C是一个C++文件(如果您让编译器决定它正在编译什么)。

GCC还支持其他后缀来指示特殊处理,例如.ii文件将被编译为C++,但不进行预处理(用于单独预处理的代码)。所有可识别的后缀都在gcc.gnu.org中详细说明

关于使用makefile和其他工具的好建议,在决定使用哪个扩展时考虑非编译器工具是帮助找到适合您的答案的好方法。

我只是想添加以下内容来帮助我找到的一些.cc vs.cpp信息。以下是按不同环境分解的扩展(来自“C++Primer Plus”一书):

Unix使用:.C.cc.cxx.c

GNUC++使用:.C.cc.cxx.cpp.c++

Clang使用:.C.cc.cxx.cpp.c++.cppm作为模块接口

数字火星使用:.cpp.cxx

BorlandC++用途:.cpp

Watcom使用:.cpp

Microsoft VisualC++使用.cpp.cxx.cc.ixx作为模块接口

Metrowerks代码战士使用:.cpp.cp.cc.cxx.c++

不同的环境支持不同的扩展。我也想回答这个问题,并找到了这篇文章。基于这篇文章,我想我可能会使用.hpp.cpp来方便跨平台/跨工具识别。

. cc扩展名对于在makefile中使用隐式规则是必要的。浏览这些链接以更好地理解makefile,但主要看第二个,因为它清楚地说明了. cc扩展名的有用性:

ftp://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_2.html

https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html

我现在才知道这一点。

我正在开始一个新的C++项目,并开始寻找最新的C++风格。我在这里结束了关于文件命名的讨论,我想我会分享我是如何做出选择的。如下所示:

Stroustrup认为这更像是商业考虑多于技术考虑

按照他的建议,让我们检查一下工具链的期望。

对于UNIX/Linux,您可以将以下默认GNU make规则解释为支持. cc文件名后缀,因为. cpp和. C规则只是别名:

$ make -p | egrep COMPILE[^=]+=
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cpp = $(COMPILE.cc)
COMPILE.C = $(COMPILE.cc)

(注意:没有默认COMPILE.cxx别名)

因此,如果您的目标是UNIX/Linux,. cc和. cpp都是非常好的选择。

当以Windows为目标时,您正在寻找. C的麻烦,因为它的文件系统不区分大小写。对您来说可能很重要的是要注意Visual Studio支持. cpp后缀

针对macOS时,请注意Xcode更喜欢. cpp/. hpp(刚刚在Xcode 10.1上检查过)。您可以随时更改标头模板以使用. h。

不管怎样,您还可以根据自己喜欢的代码库做出决定。例如,google使用. cc和LLVM libc++使用. cpp。

头文件呢?它们是在C或C++文件的上下文中编译的,因此没有编译器或构建系统需要区分. h和. hpp。然而,编辑器/IDE的语法高亮和自动缩进可能是一个问题,但这是通过将所有. h文件关联到C++模式来修复的。例如,我的emacs配置Linux以C++模式加载所有. h文件,并且它编辑C头文件很好。除此之外,当混合C和C++时,你可以遵循这个建议

我个人的结论. cpp/. h是阻力最小的路径。

正如其他人在我之前写的那样,最终它是由您的项目/团队/公司使用的。

就个人而言,我没有使用cc扩展,我试图减少扩展的数量而不是增加它们,除非有明确的值(在我看来)。

为了它的价值,这就是我在用

c-纯C代码,没有带方法的类或结构。

cpp-C++代码

hpp-仅标头代码。实现在标头中(如模板类)

h-C/C++的头文件。我同意可以进行另一种区分,但正如我所写的,为了简单起见,我试图减少扩展的数量。至少从我参与的C++项目来看,纯C的h文件更罕见,因此我不想添加另一个扩展。