Rust 1.7.0 macro宏的复用 #[macro_use]的用法

Rust 1.7.0 中的宏使用范围包括三种情况:
第一种情况是宏定义在当前文件中,这个文件可能是 crate 默认的 module,也可能是任意的 module 模块。
第二种情况是宏定义在当前 crate ,但是不是在当前文件中,而是其他 module 模块中。
第三种情况是宏定义在其他的 crate 中,或者其他的 crate 子模块中。

使用#[macro_use] 可以使被注解的module模块中的宏应用到当前作用域中;或者注释crate中的宏应用到当前crate作用域中。

第一种情况的例子:

macro_rules! say_hello{
   ()=>(
       println!("Hello");
   )
}

fn main(){
    say_hello!();
}

第二种情况:

  • 先创建一个新文件 macros.rs ,定义一个宏 say_bonjour
macro_rules! say_bonjour{
   ()=>(
       println!("Bonjour");
   )
}
  • 使用
#[macro_use]
pub mod macros;

macro_rules! say_hello{
   ()=>(
       println!("Hello");
   )
}

fn main(){
    say_hello!();
    say_bonjour!();
}
  • 如果没有 #[macro_use] 编译会出现

    error: macro undefined: ‘say_bonjour!’

第三种情况:注释在外部 crate 的语句

  1. 创建 log 项目

    cargo new log
    
  2. 在 log 项目中,lib.rs 是入口,在lib.rs中定义 macors 模块。

.
.
.
#[macro_use]
mod macros;
.
.
.

然后,创建对应mod macros 的 macros.rs 文件 vi src/macros.rs
声明宏 log、error、warn、info,在每个宏定义前面添加 #[macro_export]注释,表示这些宏可以被外部的 crate 使用。

.
.
.
#[macro_export]
macro_rules! log {
    ...
}

#[macro_export]
macro_rules! error {
    (target: $target:expr, $($arg:tt)*) => (
        log!(target: $target, $crate::LogLevel::Error, $($arg)*);
    );
    ($($arg:tt)*) => (
        log!($crate::LogLevel::Error, $($arg)*);
    )
}

#[macro_export]
macro_rules! warn {
    (target: $target:expr, $($arg:tt)*) => (
        log!(target: $target, $crate::LogLevel::Warn, $($arg)*);
    );
    ($($arg:tt)*) => (
        log!($crate::LogLevel::Warn, $($arg)*);
    )
}


#[macro_export]
macro_rules! info {
    (target: $target:expr, $($arg:tt)*) => (
        log!(target: $target, $crate::LogLevel::Info, $($arg)*);
    );
    ($($arg:tt)*) => (
        log!($crate::LogLevel::Info, $($arg)*);
    )
}


.
.
.

使用:引入 log crate的时候,注明#[macro_use]

#[macro_use]
extern crate log;

.
.
.

if !shutdown.load(Ordering::SeqCst) {
                        info!("ConnectionHandler: read timed out ({:?}). Server not shutdown, so \
                               retrying read.",
                              err);
                        continue;
                    } else {
                        info!("ConnectionHandler: read timed out ({:?}). Server shutdown, so \
                               closing connection.",
                              err);
                        break;
                    }
   .
   .
   .
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值