引言:一种语言,数十种扩展名
\n\n如果您刚开始学习 C++,那么您很可能遇到过这种情况:查看教程或 GitHub 上的代码示例时,文件有时叫 main.cpp,有时叫 utils.cc,甚至还有 program.cxx 或 source.C。一个合理的问题随之而来:“它们有什么区别?是不同的语言吗?还是只是某人的任性?”
您并不孤单。在 Stack Overflow 上,问题 “C++ code file extension? What is the difference between .cc and .cpp” 已经获得了数十万次浏览。这并不奇怪:即使是经验丰富的开发人员有时也会在这些看似微不足道的细节上感到困惑。今天,我们将一劳永逸地解开这个谜团。您将了解不同扩展名的来源、它们之间是否存在技术差异,以及初学者应该选择哪个扩展名。
\n\n简短回答:没有技术差异
\n\n让我们先消除主要的疑虑。从编译器和 C++ 语言的角度来看,.cc 和 .cpp 之间绝对没有任何区别。 这只是两种不同的方式,用于告知操作系统和构建工具,它们面前的是 C++ 源代码。
编译器(GCC、Clang、MSVC)都能识别这两种扩展名。您可以获取一个 hello.cc 文件,将其重命名为 hello.cpp,然后无需对代码进行任何更改即可编译。以下是一个简单的示例:
// 文件:hello.cc\n#include <iostream>\n\nint main() {\n std::cout << "来自 .cc 文件的问候!" << std::endl;\n return 0;\n}\n\n可以这样编译它:
\ng++ hello.cc -o hello\n\n现在将其重命名为 hello.cpp:
g++ hello.cpp -o hello\n\n结果将是相同的。编译器不关心文件叫什么名字——重要的是其内容以及您明确指定的语言(或者编译器根据扩展名自行推断)。
\n\n历史起源:.cc 和 .cpp 从何而来?
\n\n要理解为什么存在这么多扩展名,我们需要回顾历史。C++ 是作为 C 语言的扩展而创建的。早期的编译器(例如 Cfront)只是将 C++ 翻译成普通 C 的预处理器。
\n\n.cc 扩展名——Unix 遗产
\n在 Unix 系列操作系统(特别是早期版本的 AT&T Unix)中,形成了使用简短的双字符扩展名的传统。这与文件系统的限制有关:例如,在 s5fs(System V)中,文件名的长度受到严格限制。于是出现了:
\n- \n
.c— 用于 C 文件 \n .cc— 用于 C++ 文件(C + C = CC) \n .h— 用于头文件 \n
.cc 扩展名成为 Unix 和 Linux 世界的事实标准。许多大型项目(例如 Google Chromium、LLVM)至今仍在使用它。
.cpp 扩展名——DOS 和 Windows 时代
\n当 C++ 开始在 PC 世界中流行时,出现了 DOS 和早期 Windows 的生态系统。这里的限制不同,但产生了另一种需求——使扩展名尽可能易于理解。.cpp 代表 C Plus Plus——直接指向该语言。这个扩展名因以下原因而流行:
- \n
- Borland C++ 开发环境 \n
- Microsoft Visual C++ \n
- C++ 教程和书籍(以便初学者立即知道他们在处理什么) \n
其他“旅行者”扩展名
\n除了这两个主要候选者之外,在 C++ 世界中还可以遇到其他扩展名:
\n- \n
.cxx— “C++”的另一种变体,在某些 Unix 系统(例如 IBM AIX)中很流行 \n .C(大写 C)— 被某些编译器用于在区分大小写的系统上区分 C(.c)和 C++(.C)(例如在旧的