过程宏执行顺序

4

我有一个看起来像这样的proc宏

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

然后我有一个派生宏

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

是否有可能使派生宏在属性宏之后被展开?

原因是我有一个包含一些静态变量以跟踪数据的箱子。我需要在派生宏中读取数据(属性宏是写入者)。

1个回答

4

宏在语法树中是从外向内展开的;对于属性,这意味着首先从最顶层的属性开始。因此,您应该按照以下顺序编写属性,以获得所需的效果:

#[my_macro]
#[derive(Operations)]

然而,在你的宏创建中不应该使用静态变量来传递信息。现在它可以工作,但是 Rust 编译器不能保证不会缓存宏调用,以独立进程/沙盒运行每个宏扩展或其他可能会破坏你的宏通信路径的更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接