我曾见过c++代码同时保存为.cc和.cpp文件。这两者之间有什么区别吗?

谷歌风格指南似乎建议使用.cc,但没有提供解释。

我主要关心Linux系统上的程序。


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


据我所知,.cpp是c++的推荐扩展名。有些人甚至建议使用.hpp作为c++头文件,只是为了区别于C。

尽管编译器并不关心你做什么,但这是个人偏好。


只要遵循项目/团队使用的约定即可。


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


使用哪一种扩展并不重要。随便选一个你更喜欢的,只要命名一致就行。我所知道的这个命名约定的唯一例外是我不能让WinDDK(或者现在是WDK ?)来编译.cc文件。但在Linux上,这几乎不是问题。


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

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


我个人从来没有在我所从事的任何项目中看到过。cc,但在所有的技术层面上,编译器都不会关心。

谁会关心你的源代码的开发人员,所以我的经验法则是使用你的团队觉得舒服的东西。如果你的“团队”是开源社区,那么就使用一些非常常见的东西,其中.cpp似乎是最受欢迎的。


与大多数风格惯例一样,只有两件事是重要的:

在任何可能的情况下,在你所使用的东西上保持一致。 不要设计任何依赖于特定选择的东西。

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


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

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

这并不排除.cc的可能性,所以即使它并不代表任何东西(或者它真的代表什么吗?),对于面向linux的代码来说,它可能是一个很好的选择。


我个人使用.cc作为实现文件的扩展名,.hh作为头文件,.inl作为内联/模板。

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

就我所见,.cc似乎更“面向开源项目”,因为它在一些优秀的开源软件编码风格中被建议使用,而.cpp似乎更偏向于Windowish。

——编辑

如前所述,这是“从我所见”,它可能是错误的。 只是我参与的所有Windows项目都使用。cpp,而很多开源项目(主要是类unix的)使用。cc。

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

谷歌:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml ICL: http://www.doc.ic.ac.uk/lab/cplus/c++.rules/chap4.html#sect2


有几个人说。cc没有任何意义?它可能。c++最初被称为“带类的C”。

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

我只使用。cpp,但我开始使用Windows. cc更像是Unix的惯例,尽管我在Windows上看到的越来越少。GNU make有。cpp的规则,所以这可能是首选,它将在Windows和其他任何系统上默认工作。另一方面,现代c++对头文件完全不使用扩展,我真的不喜欢这样。我所有的项目都使用.h作为头文件,它们通过extern“C”和测试__cplusplus尽可能多地支持C和c++。


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


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

注意。C -大小写在GCC中很重要,.C是一个C文件,而.C是一个c++文件(如果你让编译器决定它要编译什么)。

GCC还支持其他后缀来表示特殊处理,例如.ii文件将被编译为c++,而不是预处理(用于单独的预处理代码)。所有被认可的后缀的详细信息请参见gcc.gnu.org


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

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

Unix使用。c, .cc, .cxx, .C

GNU C++用途:.C, .cc, .cxx, .cpp, .c++

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

数码火星uses: cpp, cxx

Borland c++使用:.cpp

Watcom使用:.cpp

Microsoft Visual c++使用。cpp, .cxx, .cc和.ixx作为模块接口

Metrowerks CodeWarrior uses: .cpp .cp .cc .cxx .c++

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


.cc扩展名对于在makefile中使用隐式规则是必要的。通过这些链接可以更好地理解makefiles,但主要看第二个链接,因为它清楚地说明了.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。

无论如何,您也可以根据您喜欢的代码库来决定。例如,谷歌使用.cc, LLVM libc++使用.cpp。

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

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


正如其他人在我之前所写的,最后是你的项目/团队/公司所使用的。

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

为了它的价值,这是我使用的:

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

cpp - c++代码

hpp -只有头文件的代码。实现在头文件中(像模板类一样)

h - C/ c++的头文件。我同意可以进行另一种区分,但正如我所写的,我试图减少扩展的数量以简化。至少从我工作过的c++项目来看,纯C的h文件更少,因此我不想再添加另一个扩展。