Proc宏执行顺序

Ale*_*ara 5 macros rust rust-proc-macros

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

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

然后我有一个derive macro

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

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

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

Kev*_*eid 5

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

\n
#[my_macro]\n#[derive(Operations)]\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n

(因此,扩展顺序对您来说并不重要,除非您知道您的宏不会在您自己的宏输入中看到另一个宏的扩展。)

\n