Files
cpp-course/README.md
T

4.5 KiB
Raw Blame History

Modern C++ Course (Basics → C++26)

A hands-on C++ course with 56 Google Test exercises organized into 14 modules, from your first functions to modern standard-library features.

Requirements

  • CMake 3.20+
  • GCC 16+ with C++26 and contracts support
  • CLion (recommended) or any CMake-aware IDE
  • Internet access on first configure (Google Test is fetched automatically)

Install GCC 16 on macOS (Homebrew):

brew install gcc@16

Quick Start (CLion)

  1. Open this folder in CLion (File → Open…).
  2. Use the default CMake profile (GCC 16 + C++26 from CMakePresets.json).
  3. Set the toolchain to GCC 16 (/opt/homebrew/bin/g++-16).
  4. Disable Clang-based analysis (this project targets GCC only):
    • Settings → Languages & Frameworks → C/C++ → Clangd → disable, or
    • Settings → Editor → Inspections → C/C++ → General → Clang-Tidy → disable
  5. Reload CMake, pick an exercise target (e.g. 02_control_flow_loops), implement TODOs, run tests.

Quick Start (Terminal)

cmake --preset default
cmake --build build
ctest --test-dir build --output-on-failure

Run a single exercise:

cmake --build build --target 02_control_flow_loops
./build/modules/02_control_flow/02_control_flow_loops

Manual configure (without presets):

cmake -S . -B build \
  -DCMAKE_CXX_COMPILER=/opt/homebrew/bin/g++-16 \
  -DCMAKE_C_COMPILER=/opt/homebrew/bin/gcc-16 \
  -DCOURSE_ENABLE_CONTRACTS=ON
cmake --build build

Project Structure

cppc/
├── CMakeLists.txt              # Root project + Google Test
├── CMakePresets.json           # GCC 16 + C++26 preset
├── cmake/
│   ├── CourseExercise.cmake    # add_course_exercise() helper
│   ├── CourseOptions.cmake     # Warnings, standards, contracts
│   └── toolchains/gcc-16.cmake # GCC 16 toolchain file
├── support/                    # Contract violation handler
└── modules/
    ├── 01_fundamentals/
    ├── 02_control_flow/
    └── ...                     # 14 modules total

Each module contains:

  • README.md — learning goals and exercise list
  • include/ — function and class declarations
  • src/your implementation (start here)
  • test/ — Google Test files (do not edit unless extending)

How to Study

  1. Read the module README.md.
  2. Open the exercise header to understand the required API.
  3. Implement TODOs in the corresponding src/ file.
  4. Run that exercises test target in CLion or via CTest.
  5. Move to the next exercise only when tests pass.

Course Map

Module Topic Exercises Build standard
01 Fundamentals 4 C++26
02 Control flow 4 C++26
03 Functions 4 C++26
04 Arrays & strings 4 C++26
05 Pointers & references 4 C++26
06 OOP basics 4 C++26
07 STL containers 4 C++26
08 STL algorithms 4 C++26
09 C++11 features 4 C++26
10 C++14 features 4 C++26
11 C++17 features 4 C++26
12 C++20 features 4 C++26
13 C++23 features 4 C++26
14 C++26 frontier 4 C++26

CMake Options

Option Default Description
COURSE_BUILD_TESTS ON Build Google Test exercise targets
COURSE_WARNINGS_AS_ERRORS OFF Treat warnings as errors
COURSE_ENABLE_CONTRACTS ON Enable -fcontracts on GCC 16+

Example:

cmake --preset default -DCOURSE_WARNINGS_AS_ERRORS=ON

C++26 Contracts

On GCC 16+, the build enables:

  • -fcontracts
  • -fcontract-evaluation-semantic=enforce
  • A shared handle_contract_violation handler in support/contract_handler.cpp

Example:

#include <contracts>

[[nodiscard]] auto factorial(const int n) -> long long pre(n >= 0);
auto factorial(const int n) -> long long
    pre(n >= 0)
{
    // ...
}

CLion Tips

  • Use the GCC 16 toolchain, not Apple Clang.
  • Disable Clangd and Clang-Tidy inspections — they use the Clang frontend and do not support GCC C++26 contracts.
  • Use CLions built-in GCC parser/inspections, or rely on compiler errors from the build.
  • Use Run | Run… and filter by module prefix (e.g. 02_control_flow).
  • Enable Google Test integration to see individual tests in the tree view.

Notes on C++26

All exercises build with C++26. Module READMEs describe the language feature each exercise teaches (C++11, C++17, etc.), but the toolchain baseline is C++26 throughout.

Happy learning!