2016-08-15 16 views
2

は錆で、extern C関数が外側のスコープ内で宣言することができる。名前空間を汚染することなくextern "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フォーラムでリクエストする必要があります。その間、単純にRust関数内のすべてのextern-C関数をラップし、基本となるC関数の代わりにラッパー関数を公開することはできませんでしたか? –

+0

ああ、ありがとう、#[link(name = "some_lib")] 'がコピーされるというトレードオフがあるが、静的にするには、コピー貼り付けも可能です。 – ideasman42

+0

私は混乱しています。なぜあなたはそれらをモジュールに入れられないのですか? –

答えて

8

モジュールを使用してください。

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

fn main() { 
    unsafe { ffi::exit(1); } 
} 
関連する問題