Skip to main content

C++

  • 版本演进

  • C + OOP, Generic, Async, Template, Operator Override

  • Source .cpp.cc.cxx

  • Header .h.hpp.hh

  • toolchain

    • GCC:g++
    • LLVM Clang:clang++
    • Microsoft Visual C++:cl.exe
    • CMake, Make, Ninjia
    • Conan, vcpkg
    • GDB, LLDB
    • AddressSanitizer、UndefinedBehaviorSanitizer
    • clang-tidyclang-format
  • Async

    • co_await, co_return, co_yield, std::async, Task<T>
    • FreeRTOS task - 独立栈、可抢占的任务
  • 参考

核心概念

  • 类型系统:基础类型、类、枚举、联合体、类型推导和 const / constexpr
  • 资源管理:构造函数、析构函数、RAII、移动语义和智能指针
  • 值类别:左值、右值、引用、完美转发
  • 泛型编程:函数模板、类模板、特化、Concepts 和标准库算法
  • 标准库:容器、迭代器、算法、字符串、文件系统、线程、同步原语和时间库
  • 错误处理:异常、错误码、std::expected 等显式错误表示
  • 并发:线程、锁、原子操作、Future、协程和并行算法
  • 编译与链接:翻译单元、头文件、ODR、符号、ABI、静态库和动态库
  • C 互操作:extern "C"、C ABI、封装 C 接口和跨语言 FFI
#include <iostream>

int main() {
std::cout << "Hello, C++\n";
return 0;
}
# GCC
g++ -std=c++20 -Wall -Wextra -Wpedantic -O2 main.cpp -o hello

# LLVM Clang
clang++ -std=c++20 -Wall -Wextra -Wpedantic -O2 main.cpp -o hello

./hello

# 调试构建可以加入调试信息和运行时检查:
clang++ -std=c++20 -Wall -Wextra -Wpedantic -g -fsanitize=address,undefined main.cpp -o hello-debug

CMake

hello/
├── CMakeLists.txt
└── main.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(hello LANGUAGES CXX)

add_executable(hello main.cpp)
target_compile_features(hello PRIVATE cxx_std_20)
target_compile_options(hello PRIVATE
$<$<CXX_COMPILER_ID:GNU,Clang>:-Wall;-Wextra;-Wpedantic>
)
cmake -S . -B build -G Ninja
cmake --build build
./build/hello

代码组织

  • 头文件放置声明,源文件放置实现;尽量减少头文件中的非必要实现内容
  • 使用命名空间隔离公共符号,避免把 using namespace ... 放入头文件
  • 优先使用标准库和 RAII 管理资源,减少裸 new / delete
  • 对外接口优先明确所有权、生命周期、异常保证和线程安全约束
  • 将编译器警告视为代码质量检查的一部分,并在 CI 中固定编译标准和关键警告选项
  • C++ 项目应明确编译器版本、标准库实现、目标平台和 ABI 约束

参考