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
}
}
ли что-то подобное возможно?
Это похоже на очевидную «правильную вещь» для предлагаемого языка, но я не уверен, что это так или нет. Если вы обнаружите, что это не поддерживается, вы должны запросить его на форумах Rust. В то же время вы не могли бы просто обернуть каждую функцию extern-C функцией Rust и выставить функции оболочки вместо базовых функций C? –
Ах, спасибо, я мог бы сделать это, хотя у него есть компромисс, что '# [link (name =" some_lib ")]' будет скопировано во все стороны, любые аргументы, например - для статического, должны будут быть скопировано тоже. – ideasman42
Я в замешательстве; почему вы не можете просто поместить их в модуль? –