我正在写一个到girara
库的绑定,并且状态栏项文本有问题:第一个字符丢失。
这是我绑定的一部分:
#[link(name="girara-gtk3")]
extern "C" {
// Statusbar.
pub fn girara_statusbar_item_add(session: *mut girara_session_t,
expand: bool,
fill: bool,
left: bool,
callback: girara_statusbar_event_t)
-> *mut girara_statusbar_item_t;
pub fn girara_statusbar_item_set_text(session: *mut girara_session_t,
item: *mut girara_statusbar_item_t,
text: *const c_char);
}
这就是我如何调用这些函数:
let item = unsafe { girara_statusbar_item_add(session, true, true, true, None) };
assert!(item != 0 as *mut _);
let text = CString::new("girara-left").unwrap().as_ptr();
unsafe { girara_statusbar_item_set_text(session, item, text) };
但是girara-left
我没有看,只是看irara-left
。
使用CString
一种发送*const c_char
给FFI的好方法吗?
为什么第一个字符丢失了?
更新
这里有些奇怪的事情发生。
如果我将代码更改为:
let text = CString::new("girara-left").unwrap().as_ptr();
let text2 = CString::new("hello World").unwrap();
unsafe { girara_statusbar_item_set_text(session, item, text) };
(text2
未使用的地方),hello World
则显示该文本,这是没有意义的。似乎指针没有指向正确的位置。
出现此问题的原因是,CString
在将指针发送到ffi函数之前已将丢弃(请参见此处)。
解决方案是将绑定CString
到变量:
let text = CString::new("girara-left").unwrap();
unsafe { girara_statusbar_item_set_text(session, item, text.as_ptr()) };
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句