給定std::path::Path
,將其轉換爲以空字符結尾的最直接方法是什麼std::os::raw::c_char
? (用於傳遞給具有路徑的C函數)。將路徑轉換爲* c_char最直接的方法是什麼?
use std::ffi::CString;
use std::os::raw::c_char;
use std::os::raw::c_void;
extern "C" {
some_c_function(path: *const c_char);
}
fn example_c_wrapper(path: std::path::Path) {
let path_str_c = CString::new(path.as_os_str().to_str().unwrap()).unwrap();
some_c_function(path_str_c.as_ptr());
}
有沒有辦法避免這麼多中間步驟?
Path -> OsStr -> &str -> CString -> as_ptr()
假設'Path'可以轉換爲C字符串並不準確。平臺可以並且確實使用不同的編碼;這就是爲什麼這些抽象首先存在的原因。如果您限制爲類UNIX系統,則有['OsStrExt'](https://doc.rust-lang.org/std/os/unix/ffi/trait.OsStrExt.html)。 – Shepmaster
另外請注意,您也正在轉換爲'String',它必須是UTF-8,儘管C字符串不需要。 – Shepmaster