【发布时间】:2016-12-21 06:43:40
【问题描述】:
给定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。 -
另请注意,您还要转换为
String,它必须是 UTF-8,尽管 C 字符串不需要这样做。