簡體   English   中英

如何獲取function的地址?

[英]How do I obtain the address of a function?

如何在Rust中獲取function地址? “&somefunction”到底是什么意思?

我要做什么地址

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

或者

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

(當然是在 32 位系統上)?

做什么

&function as *const _ as *const c_void

給?

如果我只是想知道一個函數的地址,我可能只是打印出來:

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

@Shepmaster 的回答給出了這個問題的答案(雖然也給出了其他不相關但可能對某些人有用的信息)。 我在這里總結一下。

獲取地址很簡單,只需

funct as *const ()

引用 function 似乎創建了一個局部變量,就像 with

let a = &42;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM