1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
//! A macro for getting `&'static CStr` from literal. //! //! This macro checks whether the given literal is valid for `CStr` //! at compile time, and returns a static reference of `CStr`. //! //! Note that it currently cannot be used to initialize constants due //! to restriction of Rust. //! //! Also, it currently only supports a UTF-8 string as input because //! Rust's tokenizer only accepts that without the `b` prefix. This //! may be expanded in the future if necessary. //! //! # Example //! //! ``` //! #[macro_use] extern crate cstr; //! use std::ffi::CStr; //! //! # fn main() { //! let test = cstr!("hello"); //! assert_eq!(test, CStr::from_bytes_with_nul(b"hello\0").unwrap()); //! # } //! ``` #[allow(unused_imports)] #[macro_use] extern crate cstr_macros; #[macro_use] extern crate procedural_masquerade; #[doc(hidden)] pub use cstr_macros::*; define_invoke_proc_macro!(cstr__invoke_build_bytes); #[macro_export] macro_rules! cstr { ($t: tt) => { { cstr__invoke_build_bytes! { cstr_internal__build_bytes!($t) } unsafe { ::std::ffi::CStr::from_bytes_with_nul_unchecked(BYTES) } } } }