2016-08-15 3 views
2

В Русте, extern C функции может быть объявлена ​​в наружном объеме:Можно ли объявлять внешние функции «C» без загрязнения пространства имен?

#[link(name = "some_lib")] 
extern "C" { 
    pub fn foo(path: *const c_char); 
    pub fn bar(path: *const c_char); 
    pub fn baz(path: *const c_char); 
    pub fn fez(path: *const c_char); 
} 

В то время как приемлемые, каждая функция должна быть доступна непосредственно foo()bar() ... и т.д.

Можно ли объявить их в каким образом они могут быть доступны с использованием общего префикса?

Пример того, как инкапсуляция может работать:

namespace some_lib { 
    #[link(name = "some_lib")] 
    extern "C" { 
     pub fn foo(path: *const c_char); 
     // ... etc ... 
    } 
} 

fn some_rust_function() { 
    unsafe { 
     some_lib::foo(); // <-- example usage 
    } 

} 

ли что-то подобное возможно?

+1

Это похоже на очевидную «правильную вещь» для предлагаемого языка, но я не уверен, что это так или нет. Если вы обнаружите, что это не поддерживается, вы должны запросить его на форумах Rust. В то же время вы не могли бы просто обернуть каждую функцию extern-C функцией Rust и выставить функции оболочки вместо базовых функций C? –

+0

Ах, спасибо, я мог бы сделать это, хотя у него есть компромисс, что '# [link (name =" some_lib ")]' будет скопировано во все стороны, любые аргументы, например - для статического, должны будут быть скопировано тоже. – ideasman42

+0

Я в замешательстве; почему вы не можете просто поместить их в модуль? –

ответ

8

Просто используйте модуль.

mod ffi { 
    extern "C" { 
     pub fn exit(_: i32) -> !; 
    } 
} 

fn main() { 
    unsafe { ffi::exit(1); } 
} 
Смежные вопросы