2015-08-31 2 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

вы знакомы с [Rust Playground] (https://play.rust-lang.org /)? Это позволит вам отвечать на такие вопросы, как «какой вывод имеет этот код». – Shepmaster

+1

Если вы хотите сохранить указатель в интеграле, используйте 'usize' вместо' u32' или 'u64', он будет иметь тот же размер, что и указатель. –

+0

@Shepmaster: Я знаю, что является результатом этого кода (I kbow, как запустить программы ржавчины, да ;-)), вопрос в том, какие точные адреса я получаю, и вы отвечаете ниже, проливает свет на него. –

ответ

6

Если бы я просто хотел бы знать адрес функции, я возможно, просто распечатайте его:

fn moo() {} 

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

Однако я не могу придумать полезное решение n, чтобы это сделать. Обычно есть что-то, что вы хотите: do с функцией. В тех случаях, вы можете также просто передать функции непосредственно, нет необходимости иметь дело с адресом:

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 { 
    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

> Вы все еще можете просто передать функцию as-is в функции extern, которые будут использовать обратный вызов. Нет, я не могу. Функция Extern принимает адреса. Период. Но ваши комментарии (с помощью println!) Помогли, спасибо. Я использовал его в этих коммитах: https://github.com/jauhien/iron-kaleidoscope/commit/154136f732f685eb6ab206e26c1f79a91de2f8b2 и https://github.com/jauhien/iron-llvm/commit/eae180417912eeade7c35b16a12bdce69ebfaf84 –

Смежные вопросы