比较 [c_char; 的惯用方式N] 与给定的硬编码字符串
Idiomatic way to compare a [c_char; N] with a given hardcoded string
我正在遍历一堆 [c_char; 256]
类型的以 null 结尾的 C 字符串,并且必须将它们与少数硬编码值进行比较,并以以下怪异结束:
available_instance_extensions.iter().for_each(|extension| {
if unsafe { CStr::from_ptr(extension.extension_name.as_ptr()) }
.to_str()
.unwrap()
== "VK_KHR_get_physical_device_properties2"
{
log::info!("Got it!");
}
});
是否有任何惯用且理智的方法可以做到这一点?
您可以使用以下方法创建 CStr
字符串:
CStr::from_bytes_with_nul(b"VK_KHR_get_physical_device_properties2[=10=]")
.unwrap();
此外,不安全的变体:
unsafe {
CStr::from_bytes_with_nul_unchecked(b"VK_KHR_get_physical_device_properties2[=11=]")
};
但我建议使用 cstr crate,这将允许更快更短的代码:
use cstr::cstr;
let result = unsafe { CStr::from_bytes_with_nul_unchecked(&extension.extension_name[..]) };
let expected = cstr!("VK_KHR_get_physical_device_properties2");
assert_eq!(result, expected);
我正在遍历一堆 [c_char; 256]
类型的以 null 结尾的 C 字符串,并且必须将它们与少数硬编码值进行比较,并以以下怪异结束:
available_instance_extensions.iter().for_each(|extension| {
if unsafe { CStr::from_ptr(extension.extension_name.as_ptr()) }
.to_str()
.unwrap()
== "VK_KHR_get_physical_device_properties2"
{
log::info!("Got it!");
}
});
是否有任何惯用且理智的方法可以做到这一点?
您可以使用以下方法创建 CStr
字符串:
CStr::from_bytes_with_nul(b"VK_KHR_get_physical_device_properties2[=10=]")
.unwrap();
此外,不安全的变体:
unsafe {
CStr::from_bytes_with_nul_unchecked(b"VK_KHR_get_physical_device_properties2[=11=]")
};
但我建议使用 cstr crate,这将允许更快更短的代码:
use cstr::cstr;
let result = unsafe { CStr::from_bytes_with_nul_unchecked(&extension.extension_name[..]) };
let expected = cstr!("VK_KHR_get_physical_device_properties2");
assert_eq!(result, expected);