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

757
我见过C++代码保存为.cc和.cpp文件的形式。
这两种形式(或其他形式)中哪一种是最佳实践/最现代化/最好使用的呢?Google样式指南似乎建议使用.cc,还有其他意见或选择吗?
我主要关注在Linux系统上的程序。

145
结论:这并不重要。 可能的起源:cc代表带类的C语言,cpp代表C++。 - Lazer
11
当你给clang++一个以.h结尾的C++头文件时,这很重要。clang++会发出警告。 - allyourcode
7
另一个稍微关注此事的工具是emacs。有了干净的.emacs配置,打开(在emacs术语中称为“查找”).h文件会激活c-mode而不是c++-mode。当然,您可以像在emacs中的所有内容一样进行配置以执行其他操作,但我的意思是c-mode是开箱即用的默认选项。 - allyourcode
8
在AIX 6.1上,“lint”关注的是.C是C++,“.c”是C,而对于“.cc”或“.cpp”则完全不理解。 - Jesse Chisholm
20
回答“无所谓”并没有真正帮助。这个问题是完全相关的。OP正在寻找一个坚实的规定来遵循。更好的答案应该是:“不幸的是,C++社区在这方面没有一个坚实的惯例。”如果你仔细想想,这很可悲。所有其他流行的语言似乎都有一个单一的、独特的文件扩展名。我会坚持使用一个重要项目使用的东西,比如gcc。他们使用.cc - Lucio Paiva
显示剩余6条评论
17个回答

898

说到底,这并不重要,因为C++编译器可以处理两种格式的文件。如果在您的团队内部真正是一个问题,那就抛硬币决定,然后继续进行实际工作。


157
好的,这是一个有道理的观点,但它并没有回答用户的问题。 - vikrantt
479
CC打字更快速。 - thang
101
为什么这个答案被认可了?一个新手程序员不会知道这不重要,他们应该得到一个直接的回答。 - Robben_Ford_Fan_boy
40
答案对于一个好奇和有心的程序员来说绝对不够。我更喜欢这个页面上的答案,因为它有更详细的解释。[https://dev59.com/i2Ml5IYBdhLWcg3wOEvG] - Novin Shahroudi
4
考虑到编译器通常不是唯一涉及的工具——几乎总会有“make”或类似的实用程序,在构建规则匹配方面将关注你使用哪些扩展名,所以这个答案实际上并没有解决问题的核心问题。请注意,系统和工具链(包括你喜欢的make规则等)会有所不同,这会影响决策。例如,某些QNX 6系列开发平台中默认的递归多目标构建系统不会将*.cpp文件作为C++语言源捆绑起来;它需要.cc扩展名。 - JoGusto
显示剩余3条评论

372

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

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

GCC还支持其他后缀以表示特殊处理,例如,.ii文件将被编译为C++,但不会预处理(用于单独预处理代码)。所有已识别的后缀详细信息可在gcc.gnu.org查看。


8
“case matters in GCC” - What about Windows (since it is case-insensitive) ? “case matters in GCC”意为“在GCC中大小写敏感”,那么Windows的情况如何(因为它不区分大小写)? - Devesh Khandelwal
24
Windows也是如此。但操作系统会防止您在文件夹中拥有仅以大小写区分的两个文件。 - Clifford
31
@DeveshKhandelwal 但它保留大小写。 - Yatharth Agarwal
1
@Clifford 理论上,所有版本的NT都允许您在一个文件夹中拥有两个(或更多)仅由大小写区分的文件,只要您在适当的位置传递FILE_FLAG_POSIX_SEMANTICS或类似参数;这就是最初的POSIX子系统、Interix/SFU/SUA甚至WSL 1的工作方式。然而,XP及更高版本需要您跳过一些障碍才能启用此功能,并且许多应用程序将因此崩溃(包括AV扫描器,因此需要跳过这些障碍)。 - Alex Shpilkin
1
@AlexShpilkin 很有趣,但在这种情况下并不特别相关。如果你这样做并拥有这样的文件,你的项目将无法在PC上进行检查和构建,除非进行此配置。依赖于文件系统配置的构建是一个坏主意。 - Clifford

332

选择使用哪个makefile和其他工具是一项很好的建议,考虑非编译器工具来决定使用哪个扩展名是一个很好的方法,以帮助找到适合自己的答案。

我想补充一下以下信息,以帮助区分 .cc.cpp。以下是不同环境下的扩展名(来自“C++ Primer Plus”书):

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

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

Clang 使用:.C.cc.cxx.cpp.c++,还有用于模块接口的 .cppm

Digital Mars 使用:.cpp.cxx

Borland C++ 使用:.cpp

Watcom 使用:.cpp

Microsoft Visual C++ 使用:.cpp.cxx.cc,还有用于模块接口的 .ixx

Metrowerks CodeWarrior 使用:.cpp.cp.cc.cxx.c++

不同的环境支持不同的扩展名。我也在寻找答案,发现了这篇文章。根据这篇文章,我认为我可能会选择 .hpp.cpp,以便于跨平台/跨工具识别。


12
与其他回答相比,这个回答确实努力尝试解决所提出的问题,即有人寻找可依赖的规约。其他语言可能有这样的规约,但就文件扩展名而言,C++似乎缺乏此类规约。 - Lucio Paiva
9
Unix在什么意义上不使用“.cpp”? - Keith Thompson
VC++6.0不支持.cc文件。 - xusisme
@KeithThompson 请检查用户user181548的答案。 - Spyros Mourelatos
@SpyrosMourelatos 是的,但在类Unix系统上,C++代码通常使用“.cpp”作为C++源文件的后缀。(引用的答案指出,“cpp”是C预处理器的缩写。) - Keith Thompson

93

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

虽然编译器不关心你的做法,但这是个人喜好。


78
我决定从使用.h切换到使用.hpp作为C++头文件的扩展名。主要原因是其他工具如编辑器也需要了解这一变化。此外,当在gcc中使用预编译头文件时,默认情况下将.h文件视为C语言文件,而.hpp文件则被视为C++语言文件,除非您在预编译.h文件时使用“-x c++-header”选项。 - jdkoftinoff
7
@jd. 同意。如果h/c文件变成hpp/cpp文件,这会使自动化工具更加容易使用。 - Paul Nathan
4
g++不能将.hpp文件识别为C++的头文件(用于预编译头文件),但是它可以识别.hh文件。因此,我最终使用了.cc/.hh而不是.cpp/.hpp,因为它们实际上并没有真正的区别。 - Tronic
15
从4.3版本开始,gcc已能够识别.hpp文件扩展名。可以对比链接:http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Overall-Options.html 和 http://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/Overall-Options.html - CesarB
3
@CharlesAddis - 是的,我不得不将同一目录下具有"c++接口"的"abcd.H"和"C接口"的"abcd.h"的大量代码转换为"abcd.hpp"和"abcd.h",因为仅仅在Windows或Mac OS X系统(默认文件系统)上执行"svn co"或解压操作就会因为"重复文件名"而失败。 - jdkoftinoff
显示剩余3条评论

44

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

正如之前所说,这主要是一种口味问题。

从我所见到的, .cc似乎更加"面向开源项目",因为在一些伟大的开源软件编码风格中建议使用它,而.cpp似乎更加Windows风格。

--- 编辑

如上所述,这是"据我所见",可能是错误的。只是我工作过的所有Windows项目都使用.cpp,而很多开源项目(主要是类Unix系统)使用.cc

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


1
你有这方面的参考资料吗?我从未见过OSS .cc与Windows .cpp。 - bobby
7
Visual Studio 会为 C++ 创建 .cpp 文件,但我不清楚其背后的历史。 - Natan Yellin
9
LLVM编码标准似乎主张使用.cpp/.h文件,并在头文件中放置-*- C++ -*-标记。参考链接:http://llvm.org/docs/CodingStandards.html;Mozilla编程风格建议使用.cpp/.h文件。参考链接:https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style;KDE似乎也在使用.cpp/.h文件。参考链接:http://quickgit.kde.org/。 - sastanin
1
上面显示的“Google编码风格”链接现在已经失效。请尝试使用此Google样式指南:https://google.github.io/styleguide/cppguide.html。同样适用于@sastanin评论中的KDE编码风格。有关KDE编码风格指南,请尝试使用“KDE编码风格”进行互联网搜索。 - Jim Fischer

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

20

另一种选项是.cxx,其中x应该是一个旋转45度的加号。

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


2
“_x应该是一个加号旋转_”哈哈,C++书呆子会做任何事情,除了字面上使用.c ++.h ++ - user426
1
@user426 我可能错了,但文件名可能并不总是允许像“+”这样的字符。 - JUDE DAILY
2
@JUDEDAILY 这里闻起来像是 DOS/Windows。 - user426

17

有几个人说.cc没有代表任何东西?但事实并非如此。C++最初被称为“带类的C”。

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

我只使用.cpp,但我从Windows开始学习。 .cc更多地是Unix惯例,尽管即使在Unix上,我也越来越少见。GNU make有.cpp的规则,因此可能更受欢迎,在Windows和其他操作系统上都可以正常工作。另一方面,现代的C++对于头文件根本不使用扩展名,我真的不喜欢这样。所有我的项目都使用.h作为头文件,并通过extern "C"和测试__cplusplus尽可能支持C和C++。


3
那不应该是 .cwc 吗? :) - Joshua
在许多编译器支持命名空间之前,它们也使用.h扩展名来表示标准头文件。通常,编译器提供已弃用的.h版本,将库放置到全局命名空间中。这允许支持旧代码。我曾经在某个地方读到过一个说法,即它们没有.h扩展名的原因是标准允许它们不是文件,而是“内置”的。但这可能是虚构的。 - Clifford

14

只需遵循项目/团队正在使用的惯例即可。


11

在我参与的项目中,我个人从未见过.cc的使用,但从技术上讲,编译器并不关心文件扩展名。

真正关心的是在开发源代码的开发人员,所以我的经验法则是选择团队习惯使用的格式。如果你的“团队”是开源社区,那么选择一些非常常见的扩展名,.cpp似乎是最受欢迎的。


一些知名的项目,例如 https://github.com/google/googletest,使用 .cc 作为 C++ 实现文件的文件扩展名。 - Vertexwahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接