3.16 宏
Rust 通过宏来支持元编程。其中宏有很多种,按实现方式可以分为两大类:声明宏(Declarative)和 过程宏(Procedural)。
按功能效果,过程宏又可以分为三类:
- Function-like 宏。类似于声明宏那样,像函数调用一样去使用的宏。
- Derive 宏。用于为数据类型自动生成一些 语法项(item),比如 trait 、结构体、方法等。
- Attribute 宏。用于更加通用的代码生成功能。
Rust 语言核心库和标准库都内置了一些声明宏和过程宏,以方便开发者使用。
内置的属性宏按功能大体又可以分为四类:
注:属性宏固定语法为
#[attr]或#![attr],以下使用用例均已简化为attr的形式。即test,allow(c)代表其在 Rust 内的实现可分别表现为#[test]及#[allow(c)]。
- 测试属性。
test属性宏用于将某个函数标记为单元测试函数。 - 诊断(Diagnostic)属性。用于在编译过程中控制和生成诊断信息。包括:
allow(c)/warn(c)/deny(c)/forbid(c)等。must_use。
- 代码生成属性。包括:
inline/cold/target_feature等。 - 编译时限制属性。包括:
recursion_limit/type_length_limit。 - 类型系统属性。包括:
non_exhaustive。
宏编程规范:
使用宏时,需要从 声明宏 和 过程宏 各自的特性为出发点,来安全使用它。
宏展开命令:
# 对单个 rs 文件
rustc -Z unstable-options --pretty expanded hello.rs
# 对项目里的二进制 rs 文件
cargo rustc --bin hello -- -Z unstable-options --pretty=expanded