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 macro(attribute macro作者是)中的数据
宏在语法树中从外向内展开(因为最外面的宏可以自由重写内部代码,以便它有更多或更少的宏调用);对于属性,这意味着扩展首先从最顶层的属性开始。因此,您应该通过按以下顺序编写属性来获得所需的扩展顺序:
\n#[my_macro]\n#[derive(Operations)]\nRun Code Online (Sandbox Code Playgroud)\n但是,您根本不应该这样做 \xe2\x80\x94 您不应该在宏包中使用静态变量来传达信息。它现在就可以工作,但 Rust 编译器不承诺不缓存宏调用、在单独的进程/沙箱中运行每个宏扩展,或者对宏扩展进行其他此类更改,从而破坏宏的通信路径。
\n(因此,扩展顺序对您来说并不重要,除非您知道您的宏不会在您自己的宏输入中看到另一个宏的扩展。)
\n