, vlog_startup_routines . ; . . C, :
int i = 7;
int a[1] = { 8 };
int *p = &i;
i , 7, a , (8), p , . , .
:
type VlogStartupRoutine = extern "C" fn();
extern "C" {
static vlog_startup_routines: VlogStartupRoutine;
}
, vlog_startup_routines - , , C void *vlog_startup_routines.
unsafe {
println!("{:p}", vlog_startup_routines);
println!("{:p}", hello_register as *const ());
}
, vlog_startup_routines, .
() :
type VlogStartupRoutine = Option<extern "C" fn()>;
#[link(name = "funcref")]
extern "C" {
static vlog_startup_routines: [VlogStartupRoutine;10];
fn hello_register();
}
fn main() {
unsafe {
println!("{:p}", vlog_startup_routines.as_ptr());
println!("{:p}", hello_register as *const ());
}
unsafe {
let routine = vlog_startup_routines[0].unwrap();
println!("Calling startup");
routine();
assert!(vlog_startup_routines[1].is_none());
}
}
, Option<extern "C" fn()> .
:
0x7efc27d37030
0x7efc27b366f0
Calling startup
hello_register called
, "", , , .: -)