有没有办法从文字字节表达式构造一个const
整数,使用字节字符串或构造整数的宏?
例如:
const MY_ID: u16 = u16_code!(ID);
const MY_WORD: u32 = u32_code!(WORD);
const MY_LONG: u64 = u64_code!(LONGWORD);
或者类似的东西,传入 b"ID"
而不是 ID
? *
当传递了错误数量的字符时,它也应该无法编译,这是我在对文字字节字符串使用位移位时无法弄清楚如何实现的。
这是一个简单的示例,可以在基本级别上运行,但无法确保参数大小正确。
// const MY_ID: u16 = u16_code!(b"ID");
#[cfg(target_endian = "little")]
macro_rules! u16_code {
($w:expr) => { ((($w[0] as u16) << 0) | (($w[1] as u16) << 8)) }
}
#[cfg(target_endian = "big")]
macro_rules! u16_code {
($w:expr) => { ((($w[1] as u16) << 0) | (($w[0] as u16) << 8)) }
}
* 查看相关问题:Is there a byte equivalent of the 'stringify' macro?
最佳答案
您可以通过对数组进行索引并将各部分移位到正确位置来为每种类型构建一个宏。 u16 的示例表达式是
((b"ID"[0] as u16) << 8) | (b"ID"[1] as u16)
您可以用来自 $e:expr
的宏替换 $e
替换 b"ID"
。
为了实现长度校验,可以插入一个无用的*$e as [u8; 2]
,如果类型不匹配,将编译失败。
关于rust - 如何从文字字节表达式构造 const 整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42199727/