Rust 如何获取函数的地址?

Rust 如何获取函数的地址?,rust,Rust,如何获取Rust中的函数地址?“&somefunction”的确切含义是什么 我要做什么 std::mem::transmute::<_, u32>(function) 给 UPD。下面@Shepmaster的回答给出了这个问题的答案(尽管也给出了其他不相关但可能对某人有用的信息)。我在这里总结一下 获取地址很容易,只需 funct as *const () 对函数的引用似乎创建了一个局部变量,就像 let a = &42; 如果我只是想知道一个函数的地址,我可能会把它

如何获取Rust中的函数地址?“&somefunction”的确切含义是什么

我要做什么

std::mem::transmute::<_, u32>(function)

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

获取地址很容易,只需

funct as *const ()
对函数的引用似乎创建了一个局部变量,就像

let a = &42;

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

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::(&function)
只会创建一个指向
function
的局部变量,然后获取该变量的引用。这将匹配此代码的工作方式:

fn main() {
    let a = &42;
}
我不需要在Rust中与他们合作,我需要一个地址,因为我有一些FFI在当前流程中获取符号的地址

您仍然可以按原样将函数传递给将使用回调的外部函数:

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); }
}

你熟悉这本书吗?它允许您自己回答诸如“此代码有什么输出”之类的问题。如果您希望将指针存储在整数中,请使用
usize
,而不是
u32
u64
,它保证与指针大小相同。@Shepmaster:我知道此代码的输出是什么(我知道如何运行rust程序,是的;-)),问题是关于我得到的确切地址,你下面的回答就说明了这一点。@Matthieu M:谢谢,我知道。看来你对参考资料的作用是正确的,谢谢。我知道如何使用函数。但是我不需要在Rust中使用它们,我需要一个地址,因为我有一些FFI在当前进程中获取符号的地址(是的,我的函数被标记为extern,因此它具有正确的调用约定)。>您仍然可以按原样将函数传递给将使用回调的extern函数。不,我不能。Extern函数接受地址。时期但是你的评论(用println!)很有帮助,谢谢。我在这些承诺中使用了它:并且
fn main() {
    let a = &42;
}
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); }
}