通过FFI从const数组中获取`* const c_char`的最佳方法是什么?

时间:2016-11-17 14:25:06

标签: rust ffi

我正在尝试与Rust中的C API进行交互。他们用宏定义了几个字符串常量:

#define kOfxImageEffectPluginApi "OfxImageEffectPluginAPI"

和一个const char *pluginApi;的结构,其中应该使用该常量:

typedef struct OfxPlugin {
  const char *pluginApi;
  // Other fields...
} OfxPlugin;

Bindgen (servo)创建以下Rust等效项:

pub const kOfxImageEffectPluginApi: &'static [u8; 24usize] = b"OfxImageEffectPluginAPI\x00";
#[repr(C)]
#[derive(Debug, Copy)]
pub struct OfxPlugin {
    pub pluginApi: *const ::std::os::raw::c_char,
    // other fields...
}

从const数组中获取*const c_char的最佳方法是什么?我尝试了as_ptr和强制转换,但是类型不匹配,因为数组是u8c_chari8 ...

1 个答案:

答案 0 :(得分:1)

让我们从一个最小的例子开始,逐步完成:

const K: &'static [u8; 24usize] = b"OfxImageEffectPluginAPI\x00";

#[derive(Debug)]
struct OfxPlugin {
    plugin_api: *const ::std::os::raw::c_char,
    // other fields...
}

fn main() {
    let p = OfxPlugin { plugin_api: K };
    println!("{:?}", p);
}

要做的第一件事是从数组中获取指针;这确实是as_ptr()

error[E0308]: mismatched types
  --> <anon>:10:41
   |
10 |         let p = OfxPlugin { plugin_api: K.as_ptr() };
   |                                         ^^^^^^^^^^ expected i8, found u8

error: aborting due to previous error

类型不匹配,因此我们需要从一种指针类型转换为另一种指针类型。这是通过as

实现的
fn main() {
    let p = OfxPlugin { plugin_api: K.as_ptr() as *const _ };
    println!("{:?}", p);
}

我们可以明确我们想要的那种指针;但是让编译器管理它更简单。