rust - What is the best way to get a `*const c_char` from a const array via FFI? -
i trying interface c api in rust. define couple of string constants macros:
#define kofximageeffectpluginapi "ofximageeffectpluginapi"
and struct const char *pluginapi;
constant supposed used:
typedef struct ofxplugin { const char *pluginapi; // other fields... } ofxplugin;
bindgen (servo) creates following rust equivalent:
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... }
what best way *const c_char
const array? tried both as_ptr
, cast, types don't match because array u8
, c_char
i8
...
let's start minimal example , work our way through:
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); }
the first thing pointer array; indeed 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 previous error
the types mismatch, need cast 1 pointer type another. achieved as
:
fn main() { let p = ofxplugin { plugin_api: k.as_ptr() *const _ }; println!("{:?}", p); }
we could explicit kind of pointer want; it's simpler here let compiler manage it.
Comments
Post a Comment