c++源文件必须用.cpp、.cc等编译器识别的扩展名,因编译器依赖后缀判断语言类型:.txt不被g++默认识别,.c会按c规则编译导致c++特性报错;.cpp最通用安全,ide、构建系统和ci均原生支持。

直接结论:C++源代码实现部分必须保存为 .cpp、.cc 或 .cxx 等编译器能识别的源文件后缀;头文件声明部分应使用 .h 或 .hpp。
为什么不能随便用 .txt 或 .c 保存 C++ 源码
编译器靠文件后缀判断语言类型和处理方式。用 .txt 保存,g++ 默认不认——它不会主动去解析纯文本里的 C++ 语法;用 .c 保存,g++ 会按 C 语言规则编译,导致 class、std::string 等 C++ 特性直接报错。即使加 -x c++ 强制指定,也增加出错概率和协作成本。
-
g++ hello.c→ 默认走 C 编译流程,std::cout未定义 -
g++ -x c++ hello.c→ 能过,但团队里别人一编译就跪 -
g++ hello.txt→ 直接报 “no input files” 或忽略该文件
.cpp 是最安全、最通用的选择
几乎所有 IDE(VS、CLion、VS Code + C++ 插件)、构建系统(CMake、Make)和 CI 流程都默认把 .cpp 当作 C++ 源文件。它不需要额外配置,不依赖编译器参数,也不挑平台。
- Windows 和 Linux 下都原生支持,大小写敏感时用
.CPP也能被g++识别(但不推荐) - CMake 中
add_executable(myapp main.cpp)不需要额外声明语言 - Git、CI 日志、错误定位都基于文件名推断语言,
.cpp最少歧义
什么时候可以考虑 .hpp 或 .inl
.hpp 不是“替代 .cpp 的源文件”,而是用于存放**必须在头文件里展开的定义**,比如模板、内联函数、constexpr 函数。它们仍属于“头文件角色”,只是扩展名暗示内容含定义。
- 普通函数实现别放
.hpp,否则多个#include会导致multiple definition链接错误 -
.inl常见于大型库(如 ACE),用于显式标记“此文件只应被#include到.cpp中”,但它本身不参与独立编译 - 如果你没在写模板库或性能敏感的内联逻辑,老实用
.h+.cpp分离就行
最容易被忽略的一点:头文件保护不是可选项。哪怕你只用 .hpp 写一个模板类,也得加 #pragma once 或 #ifndef / #define / #endif,否则一旦被两个 .cpp 同时包含,编译器看到两份相同定义,立刻报错——而这个错误常被误判为“语法问题”或“IDE 崩了”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











