我用的是bitflags板条箱。我想为我的类型自动生成一些其他实现,所以我尝试从另一个宏调用bitflags!宏。在我希望能够处理可见性令牌之前,这种方法工作得很好。
我尝试了以下代码。
use bitflags::bitflags;
macro_rules! my_bitflags {
(
$(#[$outer:meta])*
$vis:vis struct $name:ident: $ty:ty {
$(
$(#[$inner:ident $($args:tt)*])*
const $flag:ident = $value:expr;
)+
}
) => {
bitflags! {
$(#[$outer])*
$vis struct $name: $ty {
$(
$(#[$inner $($args)*])*
const $flag = $value;
)+
}
}
// other implementations on $name here
//
}
}
my_bitflags! {
pub struct Flags: u32 {
const A = 0x1;
const B = 0x2;
const C = 0x4;
}
}我希望这能正常工作,但我得到了以下错误
error: no rules expected the token `pub `这是bitflags!宏的问题吗?或者我错误地传递了可见性令牌?
发布于 2020-08-17 23:36:58
bitflags! is defined中的$vis作为令牌树(tt),而不是可见性(vis)。可见性“最近”才被引入到rustc中,通过不重新定义$vis,bitflags!宏保持了向后兼容。
您需要在my_bitflags!中将$vis:vis更改为$vis:tt,这样它才能扩展为bitflags!。
https://stackoverflow.com/questions/63452887
复制相似问题