我正在尝试与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
和强制转换,但是类型不匹配,因为数组是u8
而c_char
是i8
...
答案 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);
}
我们可以明确我们想要的那种指针;但是让编译器管理它更简单。