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

What is the best way to get a `*const c_char` from a const array via 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 c_char 的最佳方法是什么?我尝试了 as_ptr 和强制转换,但类型不匹配,因为数组是 u8c_chari8...

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

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);
}

我们可以明确我们想要的指针类型;但是这里让编译器来管理它更简单。