对于给定的std::path::Path
,最直接的方式将其转换为以空字符结尾的std::os::raw::c_char
是什么?(用于传递给需要路径的C函数)。
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
。 - ShepmasterString
,它必须是UTF-8格式的,尽管C字符串不需要这样做。 - Shepmaster