如何在Rust中获取函数地址? “和某些功能”究竟意味着什么?
我会做什么地址
std::mem::transmute::<_, u32>(function)
或
std::mem::transmute::<_, u32>(&function)
(当然是在32位系统上)?
什么是
&function as *const _ as *const c_void
给?
UPD。 @Shepmaster下面给出的答案给出了这个问题的答案(虽然也给出了其他不相关但可能对某些人有用的信息)。我在这里总结一下。
获取地址很简单,只需
funct as *const ()
对函数的引用似乎与
一样创建局部变量let a = &42;
答案 0 :(得分:8)
如果我只是想知道一个函数的地址,我可能只是将它打印出来:
fn moo() {}
fn main() {
println!("{:p}", moo as *const ());
}
然而,我想不出一个有用的理由想要这样做。通常,你想要用这个功能做。在这些情况下,您也可以直接传递函数,无需处理地址:
fn moo() {}
fn do_moo(f: fn()) {
f()
}
fn main() {
do_moo(moo);
}
我对此不太确定,但我认为std::mem::transmute::<_, u32>(&function)
只会创建一个指向function
的局部变量,然后获取对该变量的引用。这将匹配此代码的工作方式:
fn main() {
let a = &42;
}
我不需要在Rust中使用它们,我需要一个地址,因为我有一些FFI在当前进程中获取符号的地址
您仍然可以将函数按原样传递给将使用回调的extern函数:
extern {
fn a_thing_that_does_a_callback(callback: extern fn(u8) -> bool);
}
extern fn zero(a: u8) -> bool { a == 0 }
fn main() {
unsafe { a_thing_that_does_a_callback(zero); }
}