Proc宏执行顺序

Proc macro execution order

我有一个 proc macro 看起来像这样:

#[proc_macro_attribute]
pub fn my_macro(_meta: CompilerTokenStream, input: CompilerTokenStream) -> CompilerTokenStream { //* bits of code */ }

然后我有一个derive macro:

#[proc_macro_derive(Operations)]
pub fn operations(input: proc_macro::TokenStream) -> proc_macro::TokenStream { //* bits of code */ }

是否可以在属性一之后展开派生宏?

原因是我有一个箱子,里面有一些静态变量来跟踪数据。我需要读取 derive macro 中的数据(attribute macro 是作者)。

谢谢。

宏在语法树中从 outside-in 开始展开;对于属性,这意味着首先从最顶层的属性开始。所以,你应该按照这个顺序写属性得到你想要的效果:

#[my_macro]
#[derive(Operations)]

但是,您不应在宏包中使用静态变量来传递信息。它现在可以工作,但 Rust 编译器不承诺不缓存宏调用,运行 每个宏扩展在单独的 process/sandbox 中,或其他会破坏宏通信路径的此类更改。