有没有一种方法可以使用字节字符串或构造整数的宏从文字字节表达式构造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)

您可以将b"ID"替换为来自$e的宏替换$e:expr

要实现长度检查,您可以插入一个无用的*$e as [u8; 2],如果类型不匹配,则将无法编译。

10-05 22:49