2015-08-31 63 views
5

如何在Rust中获取函数地址? '& somefunction'究竟意味着什么?如何获取函数的地址?

什么地址我能得到这样

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; 
+1

你熟悉的[锈病游乐场(https://play.rust-lang.org /)?它可以让你回答像“这个代码有什么输出”的问题。 – Shepmaster

+1

如果您希望将指针存储在一个整数中,请使用'usize'而不是'u32'或'u64',它将保证与指针的大小相同。 –

+0

@Shepmaster:我知道这段代码的输出是什么(我知道如何运行防火墙程序,是的;-)),问题是关于我得到了什么确切的地址,并且你回答下面的问题揭示了它。 –

回答

6

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

fn moo() {} 

fn main() { 
    println!("{:p}", moo as *const()); 
} 

但是,我想不出有用的reaso ñ想要做到这一点。通常,你想要的功能。在这种情况下,你还不如干脆直接传递功能,无需处理地址:

fn moo() {} 

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

fn main() { 
    do_moo(moo); 
} 

我对此不太确定,但我认为std::mem::transmute::<_, u32>(&function)只想创造一个局部变量点至function,然后获取对该变量的引用。这将匹配这个代码是如何工作的:

fn main() { 
    let a = &42; 
} 

我不必在锈与他们一起工作,我需要一个地址,因为我有一些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); } 
} 
+0

似乎你是正确的参考,谢谢。我知道如何使用功能。但我不需要在Rust中与他们一起工作,我需要一个地址,因为我有一些FFI在当前进程中使用符号的地址(是的,我的函数被标记为extern,所以它具有正确的调用约定)。 –

+0

>您仍可以将该函数按原样传递给将使用回调函数的外部函数。不,我不能。外部功能接受地址。期。但你的意见(与println!)帮助,谢谢。我在这些提交中使用过它:https://github.com/jauhien/iron-kaleidoscope/commit/154136f732f685eb6ab206e26c1f79a91de2f8b2和https://github.com/jauhien/iron-llvm/commit/eae180417912eeade7c35b16a12bdce69ebfaf84 –