#字符串字面量 #字面量 #cstr #字符串 #const #

无需std cstr-literal

一个针对C字符串字面量的const友好的宏

1个不稳定版本

0.1.0 2023年6月1日

#242FFI

MIT 许可证

5KB

cstr-literal

crates.io license

此crate提供 cstr!,一个针对C字符串字面量的const友好的宏。

编译器支持:需要rustc 1.64+

为什么?

Rust没有C字符串字面量(尚未实现)。

截至编写本文时,有几个 cstr! 宏在流传,但它们都有各自的缺点(未维护、不支持const、仅限nightly、过于复杂/有bug等)

示例

简单的字面量

use core::ffi::CStr;
use cstr_literal::cstr;

const STR: &CStr = cstr!("test");

fn test() {
  assert_eq!(STR.to_bytes_with_nul(), b"test\0");
}

引用其他const项

use core::ffi::{c_char, CStr};
use cstr_literal::cstr;

const ALLOCATOR: &str = "malloc";

extern "C" {
  fn use_allocator(name: *const c_char);
}

fn test() {
  unsafe { use_allocator(cstr!(ALLOCATOR).as_ptr()) };
}

const_format

use core::ffi::CStr;
use cstr_literal::cstr;
use const_format::formatcp;

const VERSION: &CStr = {
  const PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
  const GIT_HEAD: &str = "47007ba";
  cstr!(formatcp!("{PKG_VERSION}+{GIT_HEAD}"))
};

fn test() {
  assert_eq!(VERSION.to_bytes_with_nul(), b"0.1.0+47007ba\0");
}

无std支持

感谢 rust#94079,此crate无条件支持 #![no_std]

依赖

~535KB