2016-03-19 4 views
0

У меня есть следующий код C:Подвергая символ C, содержащий массив строк из ржавчины С

const char * const Vmod_Spec[] = { 
    "example.hello\0Vmod_Func_example.hello\0STRING\0STRING\0", 
    "INIT\0Vmod_Func_example._init", 
    0 
}; 

После компиляции .so из этого кода можно загрузить этот символ с dlsym и получить содержимое Vmod_Spec и перебирать его. Как я могу достичь того же результата, который выдает такой символ из Rust?

+0

[глава FFI в книге] (https://doc.rust-lang.org/book/ffi.html) указывает, как использовать FFI в Rust. Тип будет '* const libc :: c_char'. –

+0

Я использую i8 (к которому привязан тип c_char), проблема в том, что единственный способ, которым я нашел, чтобы он отображался как символ, - это определить его как значение 'static', но я не смог найти способ определить значение 'static', эквивалентное этому массиву' char * 'этого C. –

+0

' extern {static Vmod_Spec: * const i8} '? –

ответ

1

Эквивалент ржавчины для этого будет показывать значение [*const c_char;3] как значение static. Проблема в том, что если вы объявите свое значение, как это, вы получите сообщение об ошибке: error: the trait core::marker::Sync is not implemented for the type *const i8 [E0277]. И вы не можете реализовать эту черту для *const c_char, потому что у вас нет этого типа. Обходной путь был объявить тип обертки вокруг *const c_char и использовать его вместо:

struct Wrapper(*const c_char) 
unsafe impl Sync for Wrapper { } 
#[no_mangle] 
pub static Vmod_Spec: [Wrapper; 3] = etc.. 

И тогда я буду иметь Vmod_Spec символ, который указывает на массив значений.