C/C++ 是什么以及如何搭建第一套开发环境
学习 C/C++ 的第一步不是背关键字,而是知道你到底在和谁打交道。 C/C++ 程序不是交给一个虚拟机解释执行。 它通常会被编译器翻译成目标机器可以执行的二进制代码。 这让它们非常适合系统软件、游戏引擎、数据库、编译器、嵌入式和性能敏感服务。 代价是语言不会替你自动管理所有资源,也不会在每次越界时都温柔地报错。
C 是什么
C 是一门面向过程的系统级语言。 它用变量、函数、指针、结构体和预处理器组织程序。 它让程序员直接控制内存布局、函数调用、文件 IO 和平台接口。
#include <stdio.h>
int main(void) {
printf("hello, c\n");
return 0;
}
这段代码很短,但已经包含 C 的几个核心部件:
#include把标准库声明引入当前源文件。int main(void)是程序入口。printf调用标准库输出文本。return 0把成功状态交还给操作系统。
C 更像一套精密工具箱。 工具很直接,也很锋利。 你能控制每个细节,也必须承担每个细节。
C++ 是什么
C++ 在 C 的低层能力上加入了对象、构造析构、函数重载、模板、标准库、异常、智能指针和泛型算法。 它的目标不是把 C 包一层语法糖,而是让高层抽象在运行时尽量没有额外成本。
#include <iostream>
#include <string>
int main() {
std::string name = "ZeroBug";
std::cout << "hello, " << name << '\n';
return 0;
}
这里出现了几个 C++ 特征:
std::string自动管理字符串内存。std::cout是标准输出流对象。<<被重载成输出操作。- 对象离开作用域时会自动析构。
C++ 更像把很多锋利工具放进带规则的工具箱。 规则用得好,资源释放和类型边界会更可靠。 规则不懂,就会产生更隐蔽的错误。
C 和 C++ 不是同一门语言
C++ 兼容大量 C 语法,但 C 程序不一定是好的 C++ 程序。 C++ 程序也不一定能被 C 编译器理解。 两者共享很多底层概念,却有不同的工程习惯。
| 维度 | C | C++ |
|---|---|---|
| 基本组织 | 函数和结构体 | 类、对象、模板和命名空间 |
| 资源管理 | 手动 acquire/release | RAII 和智能指针 |
| 泛型能力 | 宏、void*、代码生成 |
模板、Concepts、标准库 |
| 错误处理 | 返回码、errno |
返回值、异常、std::expected 等 |
| 抽象成本 | 显式控制 | 追求零成本抽象 |
学习路线应该先建立 C 的机器直觉,再理解 C++ 如何把资源和类型规则提升成更强的抽象。
你需要哪些工具
最小开发环境包含四类工具:
| 工具 | 作用 | 常见选择 |
|---|---|---|
| 编辑器 | 写代码 | VS Code、CLion、Vim、Xcode |
| 编译器 | 把源码变成目标文件 | GCC、Clang、MSVC |
| 构建工具 | 管理多个源文件和库 | CMake、Make、Ninja |
| 调试/诊断 | 定位崩溃和内存错误 | gdb、lldb、sanitizer |
小白阶段可以先用命令行直接编译单文件。 等源文件变多,再进入 CMake。 不要一开始就让 IDE 替你隐藏所有编译细节。
macOS 环境
macOS 上最常见的是 Apple Clang。
安装 Xcode Command Line Tools 后即可使用 clang 和 clang++。
xcode-select --install
clang --version
clang++ --version
clang 通常用于 C。
clang++ 用于 C++,它会自动链接 C++ 标准库。
如果用 clang 编译 C++,可能出现链接标准库失败。
Linux 环境
Linux 上常用 GCC 或 Clang。 Debian/Ubuntu 类系统可以安装:
sudo apt update
sudo apt install build-essential clang cmake gdb
检查工具:
gcc --version
g++ --version
clang --version
cmake --version
gcc 编译 C。
g++ 编译 C++。
虽然名字像只差两个加号,但链接行为不同。
Windows 环境
Windows 常见选择是 MSVC 或 MinGW/Clang。 初学时推荐安装 Visual Studio Build Tools 或 Visual Studio Community,并选择 C++ workload。 如果使用 VS Code,也要确认终端里能执行编译器。
cl
cmake --version
Windows 下路径、动态库、运行时库和调试符号规则与 Unix 系统不同。 后续工程化章节会单独解释这些差异。
第一个判断:源文件后缀
后缀不是标准强制语义,但构建工具会根据它判断语言。
| 后缀 | 常见含义 |
|---|---|
.c |
C 源文件 |
.h |
C 或 C++ 头文件 |
.cpp / .cc / .cxx |
C++ 源文件 |
.hpp / .hh / .hxx |
C++ 头文件 |
初学时保持简单:
- C 文件用
.c。 - C++ 文件用
.cpp。 - C 头文件用
.h。 - C++ 头文件可以用
.hpp。
第二个判断:语言标准
编译器有默认标准,但项目不应该依赖默认值。 明确写出标准版本。
clang -std=c23 hello.c -o hello-c
clang++ -std=c++23 hello.cpp -o hello-cpp
C23 是当前 C 标准背景。 C++23 是当前 C++ 发布标准背景。 但不同编译器和标准库实现进度不同。 所以工程中要同时记录编译器版本和标准库版本。
第三个判断:诊断选项
初学时就应该打开 warning。 warning 不是噪音,它是编译器告诉你代码可能越界、隐式转换、遗漏返回值或使用未初始化对象。
clang -std=c23 -Wall -Wextra -Wpedantic hello.c -o hello
clang++ -std=c++23 -Wall -Wextra -Wpedantic hello.cpp -o hello
后期可以进一步加 -Wconversion、-Wshadow 等选项。
但不要一开始堆满选项让自己寸步难行。
目录怎么放
入门项目可以这样组织:
hello-cpp/
├── src/
│ └── main.cpp
├── include/
│ └── app.hpp
└── CMakeLists.txt
单文件阶段只需要 main.c 或 main.cpp。
多文件阶段再拆 src 和 include。
不要在一个文件夹里堆几十个源文件。
你要学会读错误
编译错误通常包含文件、行号、错误类型和上下文。
main.cpp:5:10: error: use of undeclared identifier 'cout'
这句话不是让你随机搜索。 它告诉你:
- 错误在
main.cpp。 - 第 5 行第 10 列附近。
- 使用了未声明的名字
cout。 - 可能缺少
std::或头文件。
读错误能力是 C/C++ 入门的核心能力之一。
工程风险
开发环境不统一会制造很多隐蔽问题:
- 本地编译器支持 C++23,CI 不支持。
- 本地使用 GNU 扩展,目标平台只接受 ISO C。
- Debug 能跑,Release 因未定义行为崩溃。
- IDE 自动链接了库,命令行构建缺失库。
- 动态库路径在本机存在,线上不存在。
从第一天开始记录编译命令,是为了后面可以审计和回滚。
小结
C/C++ 学习不是从背语法开始,而是从建立工具链直觉开始。 源码要经过编译器。 编译器要按标准和方言理解源码。 链接器要把产物拼成程序。 操作系统要加载程序运行。 你每写一行代码,都站在这条链路上。