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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在macro_rules中使用另一个宏而不需要生锈的“extern crate”相关的知识,希望对你有一定的参考价值。

有没有办法“重新导出”#[macro_use] extern crate类似于pub use,以便使用宏的宏的用户不必手动添加这些依赖的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的用户可以在不知道id!的情况下使用lazy_static,那就太棒了。有没有办法像extern crate那样“再出口”pub use,以使以下几行脱离示例?

#[macro_use]
extern crate lazy_static;
答案

有一个不稳定的macro_reexport属性。

但是,Rust正在努力使宏(2.0)表现得像支持pub use的普通项一样,所以这个属性将不稳定并且将变得过时。

以上是关于在macro_rules中使用另一个宏而不需要生锈的“extern crate”的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一个 crate 中使用由另一个宏定义的宏?

在 Julia 中,为啥 @printf 是宏而不是函数?

macro_rules 是常规宏吗?

由于 ZEND_NUM_ARGS() 宏而无法构建扩展

在一个函数中创建一个数组并在另一个函数中读取它,而不需要返回语句

python 这是一个小型的演示,我们用它来了解上下文管理器如何在python中工作,显然它们的工作更像是宏而不是fu