Rust 宏不是简单的字符串替换,它们对解析的标记进行模式匹配,并且必须返回在调用宏的上下文中有效的 Rust 语法。
您当前的宏:
macro_rules! pad4 {
() => {
println!("0b00000000, 0b00000000, 0b00000000, 0b00000000");
}
}
在此上下文中调用:
const arr: [u8; 8] = [pad4!(), 0b01111100, 0b10000010, 0b00000010, 0b01111110];
扩展为:
const arr: [u8; 8] = [
{
println!("0b00000000, 0b00000000, 0b00000000, 0b00000000");
},
0b01111100,
0b10000010,
0b00000010,
0b01111110,
];
这就是您收到错误的原因,因为数组中的第一个表达式块返回 () 而不是预期的 u8。
您可以使用例如cargo expand 方便查看宏展开结果。
这里是pad4,但写得很好:
macro_rules! pad4 {
[$($e:expr),*] => {
[0b00000000, 0b00000000, 0b00000000, 0b00000000, $($e,)*]
}
}
const arr: [u8; 8] = pad4![0b01111100, 0b10000010, 0b00000010, 0b01111110];
playground
如果您是 Rust 声明性宏的新手,深入学习它们的首选资源是 The Little Book of Rust Macros。