【问题标题】:Using another macro in a macro_rules without requiring `extern crate` in rust在宏规则中使用另一个宏而不需要在 rust 中使用“extern crate”
【发布时间】:2017-12-29 20:43:43
【问题描述】:

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

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

在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 的用户可以在不知道lazy_static 的情况下使用id!,那就太好了。有没有办法“重新导出”extern crate 类似于 pub use 以使以下行远离示例?

#[macro_use]
extern crate lazy_static;

【问题讨论】:

    标签: macros rust


    【解决方案1】:

    有一个不稳定的macro_reexport 属性。

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

    【讨论】:

    • 感谢@Kornel。如果有人遇到这个,对于lazy_static,我特别需要的是:#![feature(macro_reexport)] #[macro_reexport(lazy_static, __lazy_static_internal, __lazy_static_create)] extern crate lazy_static; 好满口!当然现在只在夜间编译。
    猜你喜欢
    • 2017-12-10
    • 2019-05-27
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多