macro_rules! match_cfg { (#[cfg($cfg:meta)] => { $($i:item)* }) => { ... }; (#[cfg($cfg:meta)] @ #[cfg($cfg_not:meta)] => { $($i:item)* }) => { ... }; (_ => { $($i:item)* }) => { ... }; (_ @ #[cfg($cfg_not:meta)] => { $($i:item)* }) => { ... }; ( #[cfg($cfg0:meta)] => { $($i:item)* } $(#[cfg($cfgs:meta)] => { $($is:item)* })* ) => { ... }; ( $(#[cfg($cfgs:meta)] => { $($is:item)* })* _ => { $($ni:item)* } ) => { ... }; }
Expand description
The macro provided by this crate, match_cfg
, is similar to the if/elif
C
preprocessor directives and allows defining a cascade of #[cfg]
cases,
emitting the implementation which matches first.
This conveniently allows providing a long list #[cfg]
’d blocks of code
without having to rewrite each cfg()
clause multiple times.
Example
#[macro_use(match_cfg)]
extern crate match_cfg;
match_cfg! {
#[cfg(unix)] => {
fn foo() { /* unix specific functionality */ }
}
#[cfg(target_pointer_width = "32")] => {
fn foo() { /* non-unix, 32-bit functionality */ }
}
_ => {
fn foo() { /* fallback implementation */ }
}
}