A feature flag is a Cargo configuration switch for optional dependencies, functionality, implementations, or compiler behavior. Disabling unused features can reduce compile times and binary size, but increases configuration complexity. section 2.3
Use feature flags to:
- Declare optional dependencies and expose their functionality only when selected. section 2.3
- Forward configuration to dependencies, such as enabling SIMD, assembly, or architecture-specific backends. section 2.3
- Keep nightly-only functionality opt-in while preserving stable-toolchain support for users who need it. section 3.7 section 3.7.1
Manifest and source gating
A manifest can define optional dependencies and a default backend:\n\n[dependencies]\nserde = { version = "1.0", optional = true, features = ["derive"] }\n\n[features]\ndefault = ["u64_backend"]\nsimd_backend = ["curve25519-dalek/simd_backend", "sha2/asm"]\n\nSource can then conditionally import and derive support:\n\n#[cfg(feature = "serde")]\nuse serde::{Deserialize, Serialize};\n\n#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]\nstruct Message { /* ... */ }\n\nFeature definitions are Boolean, and mutually exclusive backends require deliberate configuration and validation. section 2.3
Listing 3.3 Code for lib.rs from dryoc
#![cfg_attr(
any(feature = "nightly", all(feature = "nightly", doc)), #1
feature(allocator_api, doc_cfg) #2
)]
Inspect how a nightly feature flag conditionally enables allocator_api and doc_cfg. section 3.7.1







