给定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