703

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

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

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

4

17 回答 17

842

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

于 2009-10-09T17:25:07.880 回答
349

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上详细介绍了所有公认的后缀

于 2009-10-09T21:23:17.633 回答
291

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

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

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

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

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

数字火星使用 .cpp.cxx

Borland C++ 使用:.cpp

Watcom 使用: .cpp

Microsoft Visual C++ 使用: .cpp、、.cxx.cc.ixx用于模块接口

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

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

于 2010-07-11T16:31:41.360 回答
88

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

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

于 2009-10-09T17:25:59.953 回答
41

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

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

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

- - 编辑

如前所述,这是“从我所看到的”,它可能是错误的。只是我做过的所有 Windows 项目都.cpp使用.cc.

示例编码样式使用.cc

于 2009-10-09T18:12:00.630 回答
22

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

于 2009-10-09T17:26:34.340 回答
19

另一个选项是.cxx应该x是正旋转 45° 的位置。

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

于 2009-10-09T17:28:59.873 回答
15

几个人说.cc什么都不代表什么?它可能。C++ 以“C with Classes”开始。

确实如此,.cc并且.cpp也是大多数 Unix 系统(分别为 c 编译器和 c 预处理器)上的命令名称。

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

于 2009-10-09T19:32:51.807 回答
14

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

于 2009-10-09T17:26:19.500 回答
11

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

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

于 2009-10-09T17:30:28.000 回答
11

在 makefile 中使用隐式规则需要 .cc 扩展名。浏览这些链接以更好地理解 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

我现在才知道这一点。

于 2017-05-30T08:53:55.870 回答
10

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

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

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

于 2009-10-09T17:53:41.863 回答
8

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

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

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

于 2009-10-09T18:04:41.203 回答
8

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

于 2009-10-09T19:58:42.440 回答
7

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

于 2009-10-09T17:28:26.860 回答
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是阻力最小的路径。

于 2019-01-24T19:03:14.493 回答
6

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

Personally, I am not using cc extension, I am trying to lower the number of extensions and not increase them, unless there's a clear value (in my opinion).

For what its worth, this is what I'm using:

c - Pure C code only, no classes or structs with methods.

cpp - C++ code

hpp - Headers only code. Implementations are in the headers (like template classes)

h - header files for both C/C++. I agree another distinction can be made, but as I wrote, I am trying to lower the number of extensions for simplicity. At least from the C++ projects I've worked in, h files for pure-C are more rare, therefore I did not want to add another extension.

于 2019-11-23T14:22:27.947 回答