作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用bitflags crate 。我想为我的类型自动生成其他实现,因此我尝试从另一个宏调用bitflags!
宏。在我希望能够处理可见性 token 之前,此方法一直很好。
我尝试了以下代码。
Playground
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!
宏的问题吗?还是我不正确地传递了可见性 token ?
最佳答案
$vis
中的bitflags!
is defined作为 token 树(tt
),而不是作为可见性(vis
)。仅在rustc中“最近”引入了可见性,并且bitflags!
宏通过不重新定义$vis
来保持向后兼容。
您需要将$vis:vis
中的$vis:tt
更改为my_bitflags!
,以便可以扩展为bitflags!
。
关于rust - 如何将可见性 token 传递给位标志!宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63452887/
我是一名优秀的程序员,十分优秀!