Proc宏执行顺序

问题描述 投票:0回答:1

我有一个

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
是作者)

rust macros rust-proc-macros
1个回答
5
投票

宏在语法树中从outside-in开始扩展(因为最外层的宏可以自由重写内部代码,以便它有更多或更少的宏调用);对于属性,这意味着扩展首先从最顶层的属性开始。因此,您应该通过按以下顺序编写属性来获得您想要的扩展顺序:

#[my_macro]
#[derive(Operations)]

但是,您根本不应该这样做 - 您不应该在宏包中使用静态变量来传达信息。它现在就可以工作,但 Rust 编译器不承诺不缓存宏调用、在单独的进程/沙箱中运行每个宏扩展,或者对宏扩展进行其他此类更改,从而破坏宏的通信路径。

© www.soinside.com 2019 - 2024. All rights reserved.