1个不稳定版本
0.1.0 | 2023年6月1日 |
---|
#242 在 FFI
5KB
cstr-literal
此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