用途:面向需要编写派生宏、属性宏或函数式过程宏的 Rust 开发者,讲解过程宏的入口规则、解析与代码生成方式,以及常见陷阱。
主要能力:说明三种入口属性(#[proc_macro]、#[proc_macro_derive]、#[proc_macro_attribute])所需的函数签名与调用形式;介绍 proc_macro、proc_macro2、syn、quote 四个 crate 的定位与可用范围;给出用 syn 解析输入、用 quote! 生成输出、用 syn::Error::new_spanned 报告 span 感知编译错误的方法;说明派生宏辅助属性、属性宏的两个 TokenStream 参数、泛型转发与绝对路径写法。
必要用法:过程宏必须放在 crate type 为 proc-macro 的独立 crate 中,Cargo.toml 需设置 [lib] proc-macro = true,入口函数必须是 crate 根部的 pub fn,仅使用编译器提供的 proc_macro::TokenStream。所有内部逻辑应基于 proc_macro2::TokenStream,仅在入口边界做一次 .into() 转换,以便单元测试。推荐两个 crate 的拓扑:公共 API crate 通过 pub use 重导出宏,避免用户直接依赖 *_macros crate。
适用场景:编写 derive/attribute/function-like 宏、判断是否需要 syn 或 quote、选择 parse_macro_input! 与 syn::parse2、在单元测试中测试宏逻辑、从父 crate 重导出宏。
限制:过程宏不具备卫生性,需使用绝对路径(如 ::core::option::Option)并给内部标识符加前缀;不应在宏内使用 panic! 报告用户错误;同一名称不应同时作为独立属性宏和派生辅助属性;过程宏 crate 中不应放置库代码或类型。资料未提供具体版本兼容细节与完整示例代码。