Rust 如何从宏自身的机箱中使用宏?

Rust 如何从宏自身的机箱中使用宏?,rust,Rust,我确信这是一件小事,但我似乎无法让它起作用 我了解并理解,一般来说,使用宏的方法是使用以下命令定义宏: #[macro_export] macro_rules! background(($token:expr) => (($token >> (32 + 8)) & $crate::graphics::mask::Color)); #[macro_use] extern crate terminal; ... …然后将它们导入到另一个使用它们的上下文中,使用: #[m

我确信这是一件小事,但我似乎无法让它起作用

我了解并理解,一般来说,使用宏的方法是使用以下命令定义宏:

#[macro_export]
macro_rules! background(($token:expr) => (($token >> (32 + 8)) & $crate::graphics::mask::Color));
#[macro_use]
extern crate terminal;
...
…然后将它们导入到另一个使用它们的上下文中,使用:

#[macro_export]
macro_rules! background(($token:expr) => (($token >> (32 + 8)) & $crate::graphics::mask::Color));
#[macro_use]
extern crate terminal;
...
但是,我想做的是从定义宏的板条箱中使用宏

如果我的文件结构是:

- lib.rs
- macros.rs
- foo
- foo/mod.rs
- foo/junk.rs
如何使用来自junk.rs的macros.rs中的宏


我尝试了各种组合的
#[macro\u use]mod macros
,但都没有成功。文档建议,如果宏是在某个范围内定义的,那么它在所有子模块中都可用。。。这是否意味着我必须在lib.rs中定义宏?

您需要使用
#[macro\u export]
标记宏,然后使用
#[macro\u use]
标记模块:

#[macro_use]
mod macros {
    #[macro_export]
    macro_rules! my_macro(() => (42));
}

pub mod foo {
    pub mod junk {
        pub fn usage() -> u8 {
            my_macro!()
        }
    }
}

fn main() {
    println!("{:?}", foo::junk::usage());
}
从技术上讲,如果希望机箱用户可以使用宏,则只需使用
#[macro_export]


()

公认的答案是正确的,但对于以后发现这个问题的任何人,我想补充一点,模块加载的顺序很重要

例如,在此序列中:

pub mod terminal;
pub mod terminals;
pub mod graphics;

#[macro_use]
mod macros;
如果终端使用宏中的宏,它将无法工作;
#[macro\u use]
必须出现在使用宏的任何其他模块的上方:

#[macro_use]
mod macros;

pub mod terminal;
pub mod terminals;
pub mod graphics;

这是内联的,但当我尝试使用文件时,它似乎不起作用;看看这个微不足道的例子;它的错误是“src/module1/blah.rs:2:15:2:18错误:宏未定义:'fmt!'”,但它完全按照您所说的做在您链接的代码中,可能是其他原因导致了错误?(另请参见:)@huon dbaupp啊,您是对的,它需要在main.rs是否值得注意的是,
mod macros{}
必须出现在其他
mod
声明之前取决于宏?这正是我的问题!我希望它能在书中突出显示。