学现代 C++,最怕的不是语法多,而是 demo 跑不起来、编译器版本对不上、CMake 报错看不懂。这一篇我们不讲任何语言特性,只把「能编译、能运行、知道 39 个 demo 在哪」这件事搞定。后面 27 篇会在这个环境里,逐个拆解 C++11 到 C++23 的核心特性。

这是「现代 C++ 实战」系列的第 0 篇。本系列基于 ref/cpp_demo 的 39 个独立 CMake 项目,在 Docker 或 macOS 本地编译运行。下一篇我们从 CMake 与现代构建说起,搞懂 FetchContent 依赖管理。

一、为什么这样学?

你可能已经会写 C++,但面对 C++11 之后的「现代 C++」,往往有这样的困惑:特性太多、标准迭代太快、书和博客各说各话。本系列的选择很克制:

选择 原因
Demo 驱动 每个知识点对应可编译、可运行的代码,不是纸上谈兵
39 个独立项目 每个子目录自包含,可单独拷贝到其他机器
统一 build.sh 所有 demo 同一套构建命令,降低切换成本
Docker + macOS 双环境 容器保证 Linux 一致性,本地 Apple Clang 也支持
C++11→23 递进 按标准版本组织,不跳步

可以把它想成学开车:我们先找一条封闭赛道(统一工具链),车况一致(CMake 3.14+),专心练操作,而不是先纠结「我这辆车该加几号油」。

二、项目全景

示例代码在本地 ref/cpp_demo 目录(与博客同工作区)。8 大分类、39 个独立 CMake 项目:

1
2
3
4
5
6
7
8
9
10
11
ref/cpp_demo/
├── README.md # 总索引
├── run_as_cpp_docker.sh # Docker 开发环境
├── docs/CPP_IDE_SETUP.md # clangd 配置指南
├── basics/ # 23 个子项目:语言特性、设计模式、测试
├── smart_pointers/ # 9 个智能指针演示
├── concurrency/ # 线程、线程池、C++20 同步原语
├── algorithms/ # 7 类算法与数据结构
├── networking/ # HTTP+JSON、WebSocket
├── database/ # SQLite3 CRUD
└── projects/ # 进阶项目 + FetchContent 示例

每个子目录都是独立自包含的项目,标准结构如下:

1
2
3
4
5
<项目目录>/
├── CMakeLists.txt # CMake 构建配置
├── build.sh # 跨平台构建脚本
├── README.md # 项目说明
└── src/ 或 *.cpp # 源代码

三、统一构建方式

所有 demo 遵循同一套构建命令,进入任意项目目录即可:

1
2
3
4
5
6
cd ref/cpp_demo/basics/lambda_demo   # 任选一个 demo
./build.sh # 增量编译
./build.sh -c # 清理后重新编译
./build.sh -d # Debug 模式
./build.sh --run # 编译后运行所有可执行文件
./build.sh -h # 查看帮助

build.sh 会自动完成:创建 build/ 目录 → 运行 CMake 配置 → 并行编译 → 可选运行。首次编译时还会把 compile_commands.json 链接到项目根目录,方便 clangd 识别头文件。

快速验证

选最简单的 demo 跑一遍,确认环境没问题:

1
2
cd ref/cpp_demo/basics/lambda_demo
./build.sh --run

如果终端输出了 Lambda 相关的演示结果,说明 CMake + 编译器链路已经通了。

四、Docker 环境

跨平台一致性靠 Docker。根目录的 run_as_cpp_docker.sh 会启动预配置的 Ubuntu 容器:

1
2
cd ref/cpp_demo
./run_as_cpp_docker.sh

容器基于 Ubuntu 22.04 开发镜像,预装 GCC、Clang、CMake 等工具链。镜像名可在 run_as_cpp_docker.sh 中自行配置。进入容器后,工作目录挂载到 /workspace,你可以在里面编译任意 demo。

注意:脚本中的 volume 挂载路径需改成你本机 ref/cpp_demo 的实际绝对路径,例如:

1
-v /path/to/ref/cpp_demo:/workspace

五、macOS 本地编译

不想开 Docker 也可以直接在 macOS 上编译。要求:

项目 说明
Apple Clang Xcode Command Line Tools,建议 14+
CMake 3.14 及以上
C++ 标准 各 demo 标注了所需标准(C++11 ~ C++23)

常见坑:

  • C++20/23 demo 编译失败:确认 cmake -DCMAKE_CXX_STANDARD=20 或 23,且 Clang 版本足够新
  • WebSocket demo:依赖系统 Boost,需 brew install boost
  • SQLite demo:依赖 pkg-config 和 sqlite3 开发库

大部分 basics/algorithms/ 下的 demo 在 macOS 上可以直接 ./build.sh --run,无需额外依赖。

六、IDE 配置速览

用 Cursor / VS Code 写 C++ 时,第三方库头文件可能报红(FetchContent 下载的依赖在 build/_deps/ 下)。解决办法:

  1. ./build.sh 编译一次,生成 build/compile_commands.json
  2. build.sh 会自动链接到项目根目录
  3. clangd 读取该文件,获得正确的头文件搜索路径

详细步骤见 ref/cpp_demo/docs/CPP_IDE_SETUP.md。记住一点:IDE 报红不代表编译失败,以 ./build.sh 的结果为准。

七、28 篇学习路线

本系列共 28 篇,分五季发布:

篇号 主题 篇数
第零季 00–02 环境与基础 3
第一季 03–11 现代 C++ 核心特性 9
第二季 12–17 并发与工程实践 6
第三季 18–23 算法与数据结构 6
第四季 24–27 网络、数据库与进阶项目 4

前几篇的路线图:

篇号 标题 对应 demo
00 环境搭建与项目导览 本篇
01 CMake 与现代构建 projects/fetch_content/
02 C++ 版本演进一览 basics/version_features/
03 移动语义与右值引用 basics/right_ref_demo/
04 智能指针(上) smart_pointers/ 01–04

完整大纲见工作区 docs/CPP_SERIES_OUTLINE.md

八、常用命令备忘

1
2
3
4
5
6
7
8
9
# 进入任意 demo 编译运行
cd ref/cpp_demo/<分类>/<项目>
./build.sh --run

# Docker 环境
cd ref/cpp_demo && ./run_as_cpp_docker.sh

# 清理重建
./build.sh -c && ./build.sh --run

九、小结

本篇完成了系列的地基:项目全景、统一构建、Docker / macOS 双环境、IDE 配置要点。你不需要记住 39 个 demo 的细节,只要确认 ./build.sh --run 能跑通一个 demo 就行。

现代 C++ 实战系列第 0 篇完。下一篇我们讲 CMake 与现代构建——搞懂 FetchContent,后面所有带第三方依赖的 demo 都不怕。