[−][src]Attribute Macro ctor::ctor
#[ctor]
Marks a function or static variable as a library/executable constructor. This uses OS-specific linker sections to call a specific function at load time.
Multiple startup functions/statics are supported, but the invocation order is not guaranteed.
Examples
Print a startup message:
#[ctor] fn foo() { println!("Hello, world!"); } println!("main()");
Make changes to static
variables:
static INITED: AtomicBool = AtomicBool::new(false); #[ctor] fn foo() { INITED.store(true, Ordering::SeqCst); }
Initialize a HashMap
at startup time:
#[ctor] static STATIC_CTOR: HashMap<u32, String> = { let mut m = HashMap::new(); for i in 0..100 { m.insert(i, format!("x*100={}", i*100)); } m };
Details
The #[ctor]
macro makes use of linker sections to ensure that a
function is run at startup time.
The above example translates into the following Rust code (approximately):
#[used] #[cfg_attr(target_os = "linux", link_section = ".ctors")] #[cfg_attr(target_os = "macos", link_section = "__DATA,__mod_init_func")] #[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")] static FOO: extern fn() = { extern fn foo() { /* ... */ }; foo };