如何获取函数的地址?

Jau*_*cki 7 rust

如何在Rust中获取函数地址?'和某些功能'究竟意味着什么?

我会做什么地址

std::mem::transmute::<_, u32>(function)
Run Code Online (Sandbox Code Playgroud)

要么

std::mem::transmute::<_, u32>(&function)
Run Code Online (Sandbox Code Playgroud)

(当然是在32位系统上)?

是什么

&function as *const _ as *const c_void
Run Code Online (Sandbox Code Playgroud)

给?

UPD.@Shepmaster下面给出的答案给出了这个问题的答案(虽然也给出了其他不相关但可能对某些人有用的信息).我在这里总结一下.

获取地址很简单

funct as *const ()
Run Code Online (Sandbox Code Playgroud)

对函数的引用似乎创建了一个局部变量

let a = &42;
Run Code Online (Sandbox Code Playgroud)

She*_*ter 9

如果我只是想知道一个函数的地址,我可能只是打印出来:

fn moo() {}

fn main() {
    println!("{:p}", moo as *const ());
}
Run Code Online (Sandbox Code Playgroud)

但是,我想不出一个有用的理由想要这样做.通常,你想要对这个功能做些什么.在这些情况下,您不妨直接传递函数,无需处理地址:

fn moo() {}

fn do_moo(f: fn()) {
    f()
}

fn main() {
    do_moo(moo);
}
Run Code Online (Sandbox Code Playgroud)

我对此不太确定,但我认为这std::mem::transmute::<_, u32>(&function)只会创建一个指向function然后获取对该变量的引用的局部变量.这将匹配此代码的工作方式:

fn main() {
    let a = &42;
}
Run Code Online (Sandbox Code Playgroud)

我不需要在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); }
}
Run Code Online (Sandbox Code Playgroud)