HOWTO · C++
C++ 中 .cc 和 .cpp 文件扩展名之间的区别
了解如何在 C++ .cc 和 .cpp 源文件之间选择、用 GCC 编译两种扩展名,以及重命名时为何要更新构建配置。
本页内容
对于普通 C++ 源文件,.cc 和 .cpp 是命名约定,而不是不同的 C++ 语言。请使用项目或其构建工具已经使用的扩展名;新项目则任选一种并保持一致。GCC 会把两种扩展名都识别为 C++ 输入。
用 GCC 编译两种扩展名
将以下程序保存为 main.cc 或 main.cpp:
#include <iostream>
int main() { std::cout << "C++\n"; }
使用 g++ 编译并运行这两个文件名:
g++ -std=c++23 main.cc -o cc.out && ./cc.out
g++ -std=c++23 main.cpp -o cpp.out && ./cpp.out
两个命令都会输出:
C++
此结果已在 Linux 上的 g++ (Ubuntu 15.2.0-16ubuntu1) 15.2.0 中验证。GCC 的整体选项文档将 .cc 和 .cpp 都列为 C++ 源文件后缀。示例需要支持 C++23 的 GCC/g++;如果项目要求其他语言标准,请使用项目标准。
扩展名改变了什么
扩展名帮助编译器驱动程序或构建工具对输入文件进行分类。它不会让一个文件中的代码变成另一种 C++。.cc 或 .cpp 文件可以包含完整程序、函数,或头文件中声明内容的实现;两种扩展名都不要求使用头文件或类。
C++ 标准没有强制规定某一种文件扩展名。识别规则由编译器驱动程序和工具定义,因此现有仓库的约定比按操作系统划分的笼统说法更重要。
在项目中选择 .cc 或 .cpp
| 情况 | 实用选择 |
|---|---|
| 仓库和构建文件已使用一种扩展名 | 遵循该扩展名。 |
项目规则要求 .cc |
使用 .cc;例如 Google C++ Style Guide 为 C++ 源文件规定了 .cc。 |
| 新项目没有规则 | 选择 .cc 或 .cpp,并始终一致地使用。 |
不能仅因某个扩展名与特定操作系统相关,就认为它天生更具可移植性。请检查项目实际使用的编译器、IDE 和构建配置。
不要把 .c 当作普通 C++ 文件名
这里驱动程序很重要。GCC 的通用后缀表将 .c 分类为 C 输入。不过,g++ 驱动程序文档说明,除非 -x 覆盖语言,g++ 会将 .c、.h 和 .i 输入视为 C++。在已验证的主机上,将同一个 C++ 程序命名为 main.c 后,以下命令仍然可以编译:
g++ -std=c++23 main.c -o c.out && ./c.out
它输出 C++。相反,gcc -std=c23 main.c -o gcc-c.out 在该程序上失败,因为 C 驱动程序将其视为 C,找不到 C++ 头文件 iostream。
这正是不要将普通 C++ 源文件命名为 .c 的原因:结果可能取决于构建调用了哪个驱动程序。若必须覆盖扩展名推断,GCC 接受 -x c++;Clang CommandGuide 说明 -x 可指定后续输入的语言。MSVC 文档中的 /Tp 可强制将指定文件当作 C++。具体的构建系统配置可能不同。
重命名时更新构建配置
即使源代码未变,把 main.cc 改名为 main.cpp 也可能失败。CMake、Make 规则、IDE 项目文件、文件匹配模式、生成的构建输入和脚本可能列出了旧名称,或只匹配一种扩展名。更新这些引用后重新构建项目,以验证重命名。