在macro_rules中使用另一个宏而不需要生锈的“extern crate”

时间:2017-12-29 20:43:43

标签: macros rust

有没有办法“重新导出”#[macro_use] extern crate类似于pub use,以便使用宏的宏的用户不必手动添加这些相关的extern crate

问题的其余部分是一个例子来说明。

src/lib.rs中,请注意id宏正在使用lazy_static宏:

#[macro_export]
macro_rules! id {
    () => {
        lazy_static! {
            static ref NUMBER : std::sync::atomic::AtomicUsize =
                std::sync::atomic::AtomicUsize::new(0);
        }
        return NUMBER.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
    }
}

examples/example.rs中,我们需要为每个宏添加extern crate行,即使我们只是直接使用id宏:

#[macro_use]
extern crate id_macro;
#[macro_use]
extern crate lazy_static;

fn new_id() -> usize {
    id!();
}

fn main() {
    println!("id {}", new_id()); // prints "id 0"
    println!("id {}", new_id()); // prints "id 1"
}

在示例中,如果id_macro的用户在不知道id!的情况下可以使用lazy_static,那就太棒了。有没有办法“重新导出”extern crate类似于pub use,以使以下几行脱离示例?

#[macro_use]
extern crate lazy_static;

1 个答案:

答案 0 :(得分:3)

存在不稳定的macro_reexport属性。

但是,Rust正致力于使宏(2.0)的行为与支持pub use的普通项一样,因此该属性不会稳定并且会过时。