在macro_rules中使用另一个宏而不需要生锈的“extern crate”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在macro_rules中使用另一个宏而不需要生锈的“extern crate”相关的知识,希望对你有一定的参考价值。
有没有办法“重新导出”#[macro_use] extern crate
类似于pub use
,以便使用宏的宏的用户不必手动添加这些依赖的extern crate
s?
问题的其余部分是一个例子来说明。
在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”的主要内容,如果未能解决你的问题,请参考以下文章