C ++代码文件扩展名?.cc和.cpp [关闭]


599

我已经看到C ++代码另存为.cc.cpp文件。两者之间有区别吗?

谷歌的风格指南似乎在暗示.cc,但没有提供任何解释。

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


85
结论没关系。类别的可能来源 cc = C,cpp = C加号
Lazer

6
对clang ++很重要。当给它一个名称以.h结尾的C ++头文件时,clang ++会警告您。
allyourcode

4
另一个值得关注的工具是emacs。使用干净的.emacs配置,打开(在emacs中为“ find”),. h文件将激活c模式,而不是c ++模式。当然,您可以将emacs配置为执行其他操作(与emacs中的所有内容一样),但我的意思是c模式是开箱即用的默认设置。
allyourcode

3
lint关心,.C是C ++和.c是C,没有任何认识.cc.cpp。至少在AIX 6.1上。
杰西·奇斯霍尔姆

5
回答“无所谓”并没有真正的帮助。这个问题是完全相关的。OP正在寻求遵守的常规。更好的答案是:“不幸的是,C ++社区对此没有统一的约定”。如果您考虑一下,这很可悲。所有其他流行语言似乎都有一个唯一的文件扩展名。我会坚持使用重要项目,例如gcc。他们使用.cc
Lucio Paiva

Answers:


703

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


88
好吧,这是有道理的,但是它不能回答用户的问题。
维克兰特2015年

319
CC是更快地键入

49
为什么这是公认的答案?较新的程序员不会知道这并不重要,因此应该得到一个简单的答案。
Robben_Ford_Fan_boy

13
对于一个好奇心智的程序员来说,答案是绝对不够的。我想要此页面上的答案,因为它有更详细的解释。
Novin Shahroudi

2
当人们认为编译器通常不是唯一的工具时-几乎总是存在“ make”或类似的实用程序,它将关心您使用哪些扩展名以进行构建规则匹配-那么,这个答案确实没有解决核心问题。问题的关注。请注意,系统和工具链(包括您喜欢的制作规则等)会有所不同,这会对决策产生影响。例如,在QNX 6系列开发平台中,某些默认的递归多目标构建系统不会将* .cpp文件用作C ++语言源;它不会将* .cpp文件用作C ++语言源。它需要.cc
JoGusto

296

GNU GCC承认所有以下为C ++文件,并且将使用C ++编译不管你调用它通过GCC或g ++: ,.C.cc.cpp.CPP.c++.cp.cxx

请注意,.C在GCC中,大小写.c是C文件,而.CC ++文件(如果让编译器决定编译的内容)。

GCC还支持其他后缀以指示特殊处理,例如,.ii文件将被编译为C ++,但未进行预处理(打算用于单独的预处理代码)。所有公认的后缀均在gcc.gnu.org上进行了详细说明


5
“ GCC中的大小写很重要”-Windows(因为它不区分大小写)如何处理?
Devesh Khandelwal

17
@Devesh:Windows也是如此。但是,操作系统将阻止您在文件夹中按大小写区分两个文件。
克利福德

23
@DeveshKhandelwal但要保留大小写
Yatharth Agarwal

229

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

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

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

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

Digital Mars的用途: .cpp.cxx

Borland C ++使用: .cpp

Watcom的用途: .cpp

微软的Visual C ++用途: .cpp.cxx.cc

Metrowerks CodeWarrior开发用途: .cpp.cp.cc.cxx.c++

不同的环境支持不同的扩展。我也一直想回答这个问题,并找到了这篇文章。基于这篇文章,我认为我可能会喜欢跨平台/跨工具识别.hpp.cpp为之提供便利。


5
在真正解决所提出的问题时,这个答案比其他答案最接近,这是关于某个人希望遵守的常规。其他语言也有,但是就文件扩展名而言,C ++似乎缺少它。
Lucio Paiva

6
Unix在什么意义上不使用.cpp
基思·汤普森

vc ++ 6.0不支持.cc文件。
xus

用户user181548的@KeithThompson cehck答案
Spyros Mourelatos

@SpyrosMourelatos是的,但是在类似Unix的系统上,C ++代码仍然经常.cpp用于C ++源文件。(引用的答案指出“ cpp”是C预处理程序的缩写。)
Keith Thompson

78

.cpp据我所知,是C ++的推荐扩展。甚至有人建议使用.hppC ++标头,以区别于C。

尽管编译器不在乎您做什么,但这是个人喜好。


60
我决定从使用.h切换到将.hpp用于c ++标头;主要是因为其他工具(例如编辑器)也需要了解-另外,在将预编译标头与gcc一起使用时,默认情况下,对于.h文件使用C,对于.hpp文件使用C ++,除非在预编译时使用了-x c ++-header选项.h文件。
jdkoftinoff 2009年

5
@jd。同意 如果h / c文件转换为hpp / cpp文件,它将使自动化工具稍微容易一点。
保罗·内森

4
g ++无法将.hpp识别为C ++头文件(用于头文件的预编译),但是.hh可以。因此,我最终在.cpp / .hpp上使用了.cc / .hh,因为实际上没有任何实际区别。
Tronic 2010年


3
@CharlesAddis-是的,我必须将同一目录中具有“ abcd.H”(C ++接口)和“ abcd.h”(C接口)的许多代码转换为“ abcd.hpp”和“ abcd.h” ”,因为仅执行“ svn co”或解压缩到Windows框或Mac OS X框(具有默认文件系统)将由于“重复文件名”而失败
jdkoftinoff 2013年

37

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

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

从我所看到的来看.cc似乎更像是“ 面向开放源代码项目 ”,正如一些出色的开放源代码编码风格所建议的那样,而。cpp似乎更像窗口。

-编辑

如前所述,这是“从我所见”,这可能是错误的。只是我从事过的所有Windows项目都在使用.cpp,许多开放源代码项目(主要是在类Unix上)都在使用.cc

使用.cc以下示例编码风格:


1
您对此有参考吗?我从未见过OSS .cc与Windows .cpp
鲍比

6
Visual Studio为C ++创建.cpp文件。我不知道背后的历史。
Natan Yellin

7
LLVM编码标准似乎主张.cpp / .h并将-*- C++ -*-标记放在标题llvm.org/docs/CodingStandards.html中;Mozilla编码风格建议.cpp / .hdeveloper.mozilla.org/en-US/docs/Mozilla/ Developer_guide /… ;KDE似乎也使用.cpp / .h quickgit.kde.org
萨斯坦

19

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


13

另一种选择是.cxx,其中x被认为是一个加旋转45°。

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


12

几个人说.cc不代表什么?它可能。C ++从“带类的C”开始。

诚然 .cc并且.cpp在大多数Unix系统上(分别是c编译器和c预处理器),它们也是命令名称。

我只使用.cppWindows,但是我是从Windows开始的。.cc尽管我在那儿看到的越来越少,但它更像是Unix惯例。GNU make具有适用于此的规则,.cpp因此它可能是首选,它将默认在Windows以及其他所有版本上运行。另一方面,现代C ++完全不使用标头扩展名,我真的不喜欢这样。我所有的项目都使用.h头文件,并且通过extern "C"和测试,它们都尽可能支持C和C ++ __cplusplus


2
那不应该是.cwc吗?:)
约书亚

在许多编译器支持名称空间之前,他们还使用.h扩展作为标准标头。通常,编译器提供不推荐使用的.h版本,这些版本将库放入全局名称空间。这样可以支持遗留代码。我曾经在某处读到它们没有.h扩展名的原因是该标准允许它们不是文件,而是本质上是“内置”的。但是,这可能是假的。
克利福德,

11

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


11

我个人从未见过 .cc在我从事的任何项目中见过,但从技术上讲,编译器不会在意。

谁在乎的是在您的源代码上工作的开发人员,所以我的经验法则是与您的团队相适应。如果您的“团队”是开源社区,则选择一些非常常见的东西,其中.cpp似乎最喜欢这些东西。


几个著名的项目,例如github.com/google/googletest,.cc用作C ++实现文件的文件扩展名
Vertexwahn

10

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

  1. 尽可能保持一致。
  2. 不要设计任何取决于所使用的特定选择的东西。

这些看似矛盾,但是它们各自都有其自身的价值。


8

.C并且.cc似乎是我见过的(很少)面向Unix的C ++程序的标准。我一直在用.cpp自己,因为我只在Windows上真正工作,并且从那以后一直是我的标准。

.cpp个人推荐,因为...它代表“ C Plus Plus”。当然,文件扩展名是首字母缩写是至关重要的,但是如果此原理不能证明是令人信服的,则其他重要的事情是不使用shift键(排除.C.c++),并在可能的情况下避免使用正则表达式元字符(排除.c++-不幸的是,你不能真正避免.当然情况。)

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


2
但是“ cpp”也可以代表“ C预处理器”。实际上,您系统上的程序“ cpp”很可能是C预处理器……
Jesper 2009年

8

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


8

.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

我现在才知道这一点。


同样,它们只是.cpp文件。别担心 !:-)
汤姆·泰勒

1
它说:“我们建议您对C ++源文件使用后缀'.cc',而不是'.C'。” 我怀疑这只是措辞不佳。.C在不区分大小写的文件系统的系统上使用时可能会出现问题。例如,我认为就make使用.ccover 而言,没有任何特别的优势.cpp。Makefile与.cppC ++源文件配合使用时效果很好。
基思·汤普森

7

使用哪个扩展都没关系。选择您喜欢的任何一个,只要与命名保持一致即可。我知道的这种命名约定的唯一例外是,我无法WinDDK(或WDK现在是?)来编译.cc文件。在Linux上,这几乎不是问题。


6

我正在启动一个新的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 ++模式来解决。例如,我在Linux上的emacs配置以C ++模式加载所有.h文件,并且它可以很好地编辑C头文件。除此之外,在混合使用C和C ++时,您可以遵循以下建议

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


3

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

就个人而言,我没有使用 cc扩展,而是尝试减少扩展的数量而不是增加扩展,除非有明确的价值(我认为)。

对于它的价值,这就是我正在使用的

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

cpp -C ++代码

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

h-C / C ++的头文件。我同意可以做出另一种区分,但是正如我所写的,为了简化起见,我试图减少扩展的数量。至少从我从事过的C ++项目来看h,纯C的文件很少见,因此我不想添加其他扩展名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.