比较 [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);