Rust 1.7.0 中的宏使用范围包括三种情况:
第一种情况是宏定义在当前文件中,这个文件可能是 crate 默认的 module,也可能是任意的 module 模块。
第二种情况是宏定义在当前 crate ,但是不是在当前文件中,而是其他 module 模块中。
第三种情况是宏定义在其他的 crate 中,或者其他的 crate 子模块中。
使用#[macro_use] 可以使被注解的module模块中的宏应用到当前作用域中;或者注释crate中的宏应用到当前crate作用域中。
第一种情况的例子:
第二种情况:
-
先创建一个新文件 macros.rs ,定义一个宏 say_bonjour
-
使用
-
如果没有 #[macro_use] 编译会出现
error: macro undefined: ‘say_bonjour!’
第三种情况:注释在外部 crate 的语句
创建 log 项目
1
2 1cargo new log
2
在 log 项目中,lib.rs 是入口,在lib.rs中定义 macors 模块。
然后,创建对应mod macros 的 macros.rs 文件 vi src/macros.rs
声明宏 log、error、warn、info,在每个宏定义前面添加 #[macro_export]注释,表示这些宏可以被外部的 crate 使用。
使用:引入 log crate的时候,注明#[macro_use]