#[main]Expand description
An attribute that can be attached to your main function which initializes magic statics in the specified order.
Does nothing to a magic static if it has already been initialized.
§Safety
The following behaviour is considered undefined:
- Initializing magic statics from multiple threads concurrently.
- Spawning new threads and accessing magic statics during initialization from them.
- Interior mutability of magic statics where the mutability is not synchronized across multiple threads (e.g. with a Mutex or RwLock.) This is not a problem for single-threaded applications.
§Example
mod foo {
magic_static! {
pub(super) static ref MAGIC: usize = {
println!("Magic!");
42
};
pub(super) static ref BAR: std::sync::Mutex::<()> = std::sync::Mutex::new(());
}
}
// You can also modularize your magic statics like so:
mod baz {
magic_static! {
pub(super) static ref MAGIC: usize = {
println!("Magic!");
42
};
pub(super) static ref BAR: std::sync::Mutex<()> = std::sync::Mutex::new(());
}
#[magic_static::main(
MAGIC,
BAR
)]
// The `magic_statics!` macro (NOT `magic_static!`) can generate this function for you
pub fn magic_static() {}
}
#[magic_static::main(
foo::MAGIC,
foo::BAR,
mod baz // This will initialize all magic statics in `baz`
)]
fn main() {
println!("Hello, world!");
}