本页目录
过程宏 (Procedural Macros)
过程宏在编译期运行 Rust 代码,接收 TokenStream、输出 TokenStream——derive 宏为 struct/enum 自动生成 impl,attribute 宏修饰任意项,function-like 宏像函数一样调用但处理 token 流。syn 解析 TokenStream 为 AST,quote 把 AST 转回 TokenStream,cargo expand 查看展开结果——三者是写过程宏的标准工作流。
三种过程宏
// 1. derive: #[derive(MyTrait)] — 为类型自动生成 impl
// 2. attribute: #[my_attr] — 修饰整个 item (fn, struct, impl)
// 3. function-like: my_macro!(...) — 类似 macro_rules! 但用 Rust 函数处理输入
过程宏是 Rust 代码,运行在编译期接收和产出 TokenStream——一个 token 序列。这比 macro_rules! 更灵活——你可以做任意复杂的编译期计算。
syn + quote: 事实标准
use TokenStream;
use ;
use quote;
syn 把 TokenStream 解析为 AST(类似 Rust 编译器的前端)。quote! 把 Rust 代码转回 token stream,支持插值(#name)。
proc-macro crate 的限制
- 必须是单独的 crate(
Cargo.toml:[lib] proc-macro = true) - 只能导出 proc macro 函数,不能导出普通函数、类型或常量
- 依赖不能是 cycle——proc macro crate 依赖其他 crate 但不能被同一 workspace 的 crate 依赖回
cargo expand: 展开宏
这是理解宏行为的最快方式——看到编译器实际处理的代码。
参考
- syn: docs.rs/syn, quote: docs.rs/quote
- cargo-expand: github.com/dtolnay/cargo-expand
Keywords: proc macro, derive, syn, quote, TokenStream, cargo expand, attribute macro, function-like macro