Skip to content

Ch 2: 开发环境搭建

  • 选择合适的 C++ 编译器
  • 配置构建工具 CMake
  • 设置开发环境
  • 理解 C++ 标准版本

Python 是解释型语言,代码直接由 Python 解释器执行:

Terminal window
# Python - 直接运行,无需编译
python script.py
python -m http.server 8080
python -c "print('Hello')"

解释器负责:

  • 解析 Python 代码
  • 编译成字节码(.pyc)
  • 执行字节码

C++ 是编译型语言,代码需要先编译成机器码:

Terminal window
# C++ - 编译 + 运行
g++ -std=c++20 main.cpp -o main
./main

编译器负责:

  • 解析 C++ 代码
  • 类型检查
  • 生成目标代码
  • 链接库文件

Linux 和 macOS(通过 Xcode)都可使用:

Terminal window
# 检查版本
g++ --version
# 编译
g++ -std=c++20 main.cpp -o main
# 常用选项
g++ -Wall -Wextra -O2 -std=c++20 main.cpp -o main
# -Wall: 启用所有警告
# -Wextra: 额外警告
# -O2: 优化级别

macOS 默认的 C++ 编译器:

Terminal window
# 检查版本
clang++ --version
# 编译
clang++ -std=c++20 main.cpp -o main
# macOS 上通常指向 Apple Clang

Windows 上的选择:

Terminal window
# 使用 Visual Studio Developer Command Prompt
cl /std:c++20 main.cpp /Fe:main.exe
# 或使用 MSYS2/MinGW
pacman -S mingw-w64-clang
平台推荐编译器版本要求
macOSXcode Command Line Tools (Clang)Clang 15+ 支持 C++20
LinuxGCCGCC 11+ 支持 C++20
WindowsVisual Studio 2022 / MSVCMSVC 2022 支持 C++20

Python 使用包管理器安装依赖:

Terminal window
# pip
pip install requests
pip freeze > requirements.txt
pip install -r requirements.txt
# poetry
poetry add requests
poetry install
poetry export -f requirements.txt

CMake 是 C++ 的标准构建系统,它不是编译器,而是一个”构建文件生成器”:

CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(StdLibDemo LANGUAGES CXX)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加可执行文件
add_executable(myapp main.cpp)

CMake 的工作流程:

CMakeLists.txt (人类可读)
↓ cmake 命令
Makefile / Ninja / MSBuild (机器生成)
↓ make/ninja/msbuild
可执行文件
cmake_minimum_required(VERSION 3.16)
project(MyProject VERSION 1.0.0 LANGUAGES CXX)
# C++ 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# 优化和警告
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic")
endif()
# 搜索库
find_package(Threads REQUIRED)
# 添加可执行文件
add_executable(myapp
src/main.cpp
src/utils.cpp
include/utils.h
)
# 链接库
target_link_libraries(myapp PRIVATE Threads::Threads)
Terminal window
# 创建构建目录(不要在源码目录构建!)
mkdir build && cd build
# 配置(生成构建文件)
cmake .. # 或 cmake -S . -B build
# 编译
cmake --build . # 或 make / ninja
# 或一步完成
cmake .. && cmake --build .
# 清理
rm -rf build

轻量级但功能强大:

必需扩展:

  • C/C++ (Microsoft)
  • CMake Tools (Microsoft)

配置示例:

.vscode/c_cpp_properties.json
{
"configurations": [{
"name": "Mac",
"compilerPath": "/usr/bin/clang++",
"cppStandard": "c++20",
"intelliSenseMode": "macos-clang-arm64"
}]
}

JetBrains 出品的专业 C++ IDE:

  • 原生支持 CMake
  • 智能代码补全
  • 调试器集成

Windows 上的完整 IDE:

  • 安装时选择”使用 C++ 的桌面开发”
  • 内置 MSVC 编译器
  • 丰富的调试功能

不同标准支持不同特性:

// C++11 之前
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
// 繁琐的迭代器写法
}
// C++11 - 范围 for
for (int x : v) {
// 简洁
}
// C++20 - auto 推导
for (auto x : v) { // 更简洁
std::cout << x << std::endl;
}

C++11(现代 C++ 起点):

auto x = 5; // 类型推导
auto lambda = [](int x) { return x * 2; }; // Lambda
std::shared_ptr<int> sp; // 智能指针
std::move(x); // 移动语义

C++14:

auto lambda = [](auto x) { return x * 2; }; // 泛型 Lambda
constexpr int fib(int n) { return n <= 1 ? n : fib(n-1) + fib(n-2); }

C++17:

if (auto it = m.find(key); it != m.end()) { // if 初始化
auto [k, v] = *it; // 结构化绑定
}
std::optional<int> opt; // 可选值
std::variant<int, float> v; // 联合体

C++20(本书默认):

template<std::integral T> // Concepts
auto result = nums | std::views::filter(...); // Ranges
std::format("{}", 42); // 格式化
co_await std::suspend_always{}; // 协程

C++23:

std::expected<int, Error> result; // 错误处理
auto view = nums | std::ranges::to<std::vector>(); // Ranges to
my_stdlib_demo/
├── CMakeLists.txt
├── src/
│ └── main.cpp
└── build/
cmake_minimum_required(VERSION 3.16)
project(StdLibDemo VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(myapp src/main.cpp)
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
int main() {
// 演示标准库用法
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
// 遍历(C++11 范围 for)
std::cout << "Names: ";
for (const auto& name : names) {
std::cout << name << " ";
}
std::cout << std::endl;
// 排序(C++11 Lambda)
std::sort(names.begin(), names.end(),
[](const std::string& a, const std::string& b) {
return a.length() < b.length();
});
std::cout << "Sorted by length: ";
for (const auto& name : names) {
std::cout << name << " ";
}
std::cout << std::endl;
return 0;
}
Terminal window
mkdir build && cd build
cmake ..
cmake --build .
./myapp
// 错误
std::vector<int> v{1, 2, 3};
sort(v.begin(), v.end()); // 错误:sort 在 std 命名空间
// 正确
std::sort(v.begin(), v.end());
// 错误
std::string s = "hello";
std::cout << s << std::endl;
// 正确
#include <string>
#include <iostream>
// 如果编译器不支持 C++20
// std::format 可能不可用
// 检查是否支持
#if __cplusplus >= 202002L
std::cout << std::format("C++20\n");
#else
std::cout << "Pre-C++20\n";
#endif
  • C++ 需要显式编译,编译器将代码翻译成机器码
  • CMake 是标准构建系统,跨平台支持好
  • C++20 是当前主流版本,具备完整的现代特性
  • 编译时检查能提前发现错误
  • 常见的编译错误包括:未声明标识符、缺少 include、标准版本不匹配

下章预告:ch03 字符串和文本处理。