直接回答:声明宏是模式匹配加模板替换:定义若干 (模式) => {展开} 规则,编译器按序尝试匹配。它写起来像 match,适合局部、重复样板少的代码生成(vec!、assert_eq! 都是它)。过程宏是编译期运行的 Rust 函数,接收 TokenStream、返回 TokenStream,可以做任意分析和生成,分 derive(#[derive])、属性宏、函数式宏三种。serde 的 derive、tokio 的 #[tokio::main] 都是过程宏。

展开解析:选型信号:能用声明宏别上过程宏——过程宏要独立 crate(proc-macro = true)、引入 syn/quote 依赖、显著增加编译时间;声明宏在 crate 内即用即写。声明宏的局限:只做语法层面匹配,拿不到类型信息(不知道某个标识符是什么类型),错误信息也较差。过程宏能做类型级分析(读结构体字段生成序列化代码),但写出健壮的 derive(处理泛型、where 子句、属性解析)工作量不小。卫生性方面声明宏是部分卫生的(局部变量不串名),过程宏用 quote!#var 插值默认安全。调试技巧:cargo expand 查看宏展开结果是两类宏共同的排错利器。

追问方向:声明宏的 $crate 作用是什么?derive 宏如何添加自定义属性?宏与泛型的能力边界怎么划分?

(约 440 字)