custom-allocators
Custom allocator skill for memory allocation strategies. Use when implementing…
C++20 modules skill for modern C++ projects. Use when working with named modules, module partitions, header units, CMake MODULE_SOURCES, Clang -fmodules-ts, BMI caching issues, or migrating from headers to modules. Activates on queries about C++20 modules, import statements,
$ npx -y skills add mohitmishra786/low-level-dev-skills --skill cpp-modules --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/cpp-modulesContext preview
The summary Claude sees to decide when to auto-load this skill.
C++20 modules skill for modern C++ projects. Use when working with named modules, module partitions, header units, CMake MODULE_SOURCES, Clang -fmodules-ts, BMI caching issues, or migrating from headers to modules. Activates on queries about C++20 modules, import statements,
name: cpp-modules description: C++20 modules skill for modern C++ projects. Use when working with named modules, module partitions, header units, CMake MODULE_SOURCES, Clang -fmodules-ts, BMI caching issues, or migrating from headers to modules. Activates on queries about C++20 modules, import statements, module interface units, header units, or BMI files. user-invocable: true triggers: - C++20 modules - import statement C++ - module interface unit - header units C++20 - BMI file caching - cmake C++ modules - Clang fmodules-ts - migrate headers to C++ modules
Guide agents through authoring, building, and debugging C++20 modules: named modules vs header units, module partitions, CMake integration, compiler-specific flags, and interoperability with legacy headers.
C++20 module kinds: ├── Named module interface unit (.cppm / .ixx) — exports declarations ├── Module implementation unit (.cpp) — defines module members ├── Module partition (.cppm) — internal module subdivision └── Header unit (any header) — import a legacy header as module
Named modules are the primary target. Header units are a bridge for legacy code. Avoid Global Module Fragment unless required for macro access.
// math.cppm — module interface unit
export module math; // declares the module name
export int add(int a, int b) { return a + b; }
export double pi = 3.14159;
// Non-exported (module-private)
int internal_helper() { return 42; }// main.cpp — consumer
import math; // import the module
#include <iostream> // legacy header (still works)
int main() {
std::cout << add(2, 3) << "\n"; // 5
std::cout << pi << "\n";
}// math-core.cppm — partition
export module math:core; // partition 'core' of module 'math'
export int add(int a, int b) { return a + b; }// math.cppm — primary module interface export module math; export import :core; // re-export the partition
// math-impl.cpp — implementation unit (no export) module math; // belongs to 'math' module, not a partition // has access to all math declarations, but exports nothing
// Import a standard library header as a module unit import <iostream>; // header unit (compiler generates BMI) import <vector>; // Or import a project header (must be compilable as header unit) import "myheader.h";
Header units do NOT provide macros to importers. For macro access, use the Global Module Fragment:
module; // Global Module Fragment starts here #include <cassert> // macros like assert() are available export module mymod; // ... rest of module
# Compile module interface → produces .pcm (precompiled module) clang++ -std=c++20 --precompile math.cppm -o math.pcm # Compile implementation using the .pcm clang++ -std=c++20 -fmodule-file=math=math.pcm -c math.cpp -o math.o # Compile consumer clang++ -std=c++20 -fmodule-file=math=math.pcm main.cpp math.o -o prog
# GCC ≥11 supports modules (experimental ≥11, better ≥14) # Compile interface unit → produces .gcm in gcm.cache/ g++ -std=c++20 -fmodules-ts math.cppm -c -o math.o # Compiler auto-discovers .gcm files in gcm.cache/ g++ -std=c++20 -fmodules-ts main.cpp math.o -o prog
cmake_minimum_required(VERSION 3.28)
project(myproject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
add_library(math)
target_sources(math
PUBLIC
FILE_SET CXX_MODULES FILES # module interface units
src/math.cppm
src/math-core.cppm
PRIVATE
src/math-impl.cpp # implementation unit
)
add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE math)# Requires a generator that supports modules (Ninja ≥1.11 or MSBuild) cmake -S . -B build -G Ninja cmake --build build
For CMake 3.25–3.27 (experimental):
cmake_minimum_required(VERSION 3.25) set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "3c375311-a3c9-4396-a187-3227ef642046") set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP ON)
| Error | Cause | Fix | |-------|-------|-----| | `module 'math' not found` | BMI not found in search path | Compile interface unit first; check `-fmodule-file=` flags | | `cannot import header in module` | `#include` inside module purview | Move `#include` to Global Module Fragment or use `import <>` | | `redefinition of module 'math'` | Two `.cppm` files declare same module | Only one primary interface per module | | `macro not available after import` | Macros don't cross module boundaries | Move macro-dependent code to GMF or use `#include` | | `ODR violation` | Same name in multiple partitions | Each name exported from exactly one partition | | BMI cache stale | `.pcm`/`.gcm` not rebuilt after change | Clean build or ensure dependency tracking is working |
// Wrapping a C library for module use export module cjson; module; // Global Module Fragment #include <cjson/cJSON.h> // C header with macros export module cjson; // back to module purview // Re-export key types (optional) export using ::cJSON; export using ::cJSON_Parse;
For CMake module support details, see [references/modules-cmake-support.md](references/modules-cmake-
A curated suite of AI agent skills for systems and low-level programming — C/C++, Rust, Zig, GPU, bare-metal firmware, Linux kernel/driver development, computer architecture, compiler internals, HPC, and more.
Repo: mohitmishra786/low-level-dev-skills
Custom allocator skill for memory allocation strategies. Use when implementing…
NUMA programming skill for multi-socket memory locality. Use when detecting NUMA topology,…
AF_XDP skill for high-performance XDP sockets. Use when creating AF_XDP sockets, configuring…
DPDK skill for userspace packet I/O. Use when initializing EAL, configuring PMD drivers,…
io_uring skill for Linux async I/O. Use when building high-performance servers with liburing,…
Bare-metal ADC and DAC skill. Use when configuring analog sampling, DMA-driven ADC,…