P.MAC.DCL.07 确保在宏定义之后再去调用宏
【描述】
Rust 中类型或函数在定义前后都可以调用,但是宏不一样。Rust 查找宏定义是按词法依赖顺序的,必须注意定义和调用的先后顺序。
【反例】
mod a { // X!(); // undefined } mod b { // X!(); // undefined macro_rules! X { () => {}; } X!(); // defined } mod c { // X!(); // undefined } fn main() {}
【正例】
macro_rules! X { () => {}; } mod a { X!(); // defined } mod b { X!(); // defined } mod c { X!(); // defined } fn main() {}
【例外】
宏与宏之间相互调用,不受词法顺序的限制。
mod a { // X!(); // undefined } macro_rules! X { () => { Y!(); }; } // 注意:这里的 Y! 宏是在定义前被调用的,代码正常执行 mod b { // X!(); // defined, but Y! is undefined } macro_rules! Y { () => {}; } // Y! 宏被定义在 X! 宏后面 mod c { X!(); // defined, and so is Y! } fn main() {}