C+
Introduction · View as Markdown

The C+ Manual

C+ compiles to native code through LLVM. It has no garbage collector, no exceptions, no closures, no overloading, no implicit conversions, and no null. Memory is managed manually and checked through ownership and borrowing rules, with C ABI compatibility in both directions.

This manual documents C+ 0.0.30. The source of truth for behavior is the tagged compiler and package tree at v0.0.30.

Start here

Platforms in 0.0.30

C+ programs run across seven supported platform families:

macos  linux  windows  ios  android  esp32  wasm

The native cpc toolchain runs on macOS, Linux, and Windows. It self-links executables on those hosts and cross-compiles static libraries and headers for iOS, Android, and ESP32. The wasm platform is used through cpc-wasm; it is not a native cpc --target value. See Platforms and targets for target names and artifact behavior.

Facet has native backends for the supported application platforms:

Platform Facet backend Status in 0.0.30
macOS facet_appkit Supported
iOS facet_uikit Supported; simulator exercised, device build available
Android facet_android Supported
Linux facet_gtk Supported
Windows facet_winui Supported (default; facet_win32 is deprecated as an explicit opt-out)

Facet applications use facet_runtime: register windows with app.window(name, factory, chrome:), register routes on each window, and start the application with App::run.

What changed in 0.0.30 (and 0.0.29)

  • WinUI 3 on Windows: facet_winui, agent_winui, and winui are now the default Windows UI and agent backends for facet_runtime and facet_agent. facet_win32 is deprecated and remains reachable as an explicit opt-out (facet_runtime/win32::select()).
  • App environment and assets (appenv): appenv provides app_data_dir, cache_dir, no_backup_dir, resource_dir, asset_path, read_asset, read_asset_text, and app_id from the first line of main on macOS, Linux, Windows, iOS, and Android. cpc build stages <root>/assets/* into target/assets/<target>/<mode>/ and mirrors them beside self-linked binaries (cpc build --print-asset-dir prints the staged tree for external builders).
  • One [package] app_id across platforms: cpc init --app-id writes app_id into Cplus.toml and each platform manifest; cpc build checks validity (E0415) and warns on drift (W0008).
  • Unified hybrid_web page bridge (facet/hybrid_page): JavaScript calls window.facet.postMessage(str) up, native dispatches HybridWebViewMessageReceived (e.detail.message) down, and C+ reads payloads via hybrid_page::message(sender) across AppKit, UIKit, Android, GTK, and WinUI.
  • Liquid Glass & Material 3 UI parity: iOS 26 Liquid Glass tab bars, blur effects, and push navigation in facet_uikit; Material 3 dynamic palette tokens, tab bars, bottom sheets, and dialogs in facet_android; bundled Material Symbols icon font (facet/icon_font), named_size typography roles, and file drop/save-panel support.
  • Language intrinsics & target features: #bitcast::[T](v) reinterprets bits between same-width floats and integers (replacing fN::from_bits / .to_bits(), introduced in 0.0.29); #target_feature("avx2") queries enabled ISA extensions alongside --target-cpu and --target-feature; stdlib/template (Template) receives unjoined string literal parts and arguments; stdlib/path adds path manipulation helpers.
  • Compiler soundness, diagnostics, and doctests: Generic impl templates are checked at definition time and treat unbounded T as move-only with potential drop; type aliases are resolved before borrow/move/drop checks; W0009 warns on discarded Status returns; E1010 rejects @view blocks on leaf controls (scroll { ... } now takes a @view block); cpc test extracts both bare ``` and ```cplus doctest fences and fails on unclosed fences.

C plus packages

The language core supplies types, ownership, control flow, compilation, and the C ABI. The standard library, UI stack, platform bindings, services, data libraries, and numerical libraries live in packages. See the package index and modules and packages.

Versioned manual

The clean /docs URLs always serve Doc::CURRENT. Frozen releases remain available under /docs/{version}. Every page also has a raw Markdown representation by appending .md; /llms.txt indexes the current manual and /llms-full.txt concatenates it.