Ich schreibe eine Bindung an die girara
-Bibliothek, und ich habe ein Problem mit dem Text in der Statusleiste: Das erste Zeichen fehlt.Fehlendes erstes Zeichen von C-String
Hier ist ein Teil meiner Bindung:
#[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);
}
und hier ist, wie ich diese Funktionen aufrufen:
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) };
Aber statt girara-left
zu zeigen, wie ich sehe irara-left
nur.
Verwenden Sie CString
eine gute Möglichkeit, *const c_char
zu einem FFI zu senden?
Warum fehlt das erste Zeichen?
aktualisieren
Es gibt hier etwas seltsam hapening.
Wenn ich den Code ändern zu:
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) };
(wo text2
nicht verwendet wird), wird der Text hello World
gezeigt, die keinen Sinn macht. Es scheint, dass der Zeiger nicht an der richtigen Stelle zeigt.
Und stellen Sie sicher, dass Ihre '' girara_statusbar_item_set_text Funktion hält keinen Verweis auf diese Zeichenfolge darüber hinaus, wie lange das 'CString' lebt ... ! – Shepmaster
Beachten Sie, dass Clippy [ein Flusen dafür] hat (https://github.com/Manishearth/rust-clippy/wiki#temporary_cstring_as_ptr) (Disclaimer: Ich bin ein Clippy Mitwirkender). – mcarton