Crates.io | cstr-literal |
lib.rs | cstr-literal |
version | 0.1.0 |
source | src |
created_at | 2023-06-01 01:09:11.420653 |
updated_at | 2023-06-01 01:09:11.420653 |
description | A const-friendly macro for C string literals. |
homepage | |
repository | https://github.com/notpeelz/cstr-literal |
max_upload_size | |
id | 879364 |
size | 9,084 |
This crate provides cstr!
, a const-friendly macro for C string literals.
Compiler support: requires rustc 1.64+
Rust doesn't have C string literals (yet).
As of writing this, there's a couple cstr!
macros floating around, but they
all have their own set of drawbacks (unmaintained, no const support, nightly-only, overly complex/buggy, etc.)
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");
}
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()) };
}
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");
}
Thanks to rust#94079, this crate is unconditionally #![no_std]
.