你如何使用它自己的板条箱中的宏?
How do you use a macro from inside its own crate?
我确信这很容易做到,但我似乎无法让它发挥作用。
我看过 http://doc.rust-lang.org/book/advanced-macros.html#scoping-and-macro-import/export,我很欣赏,一般来说,使用宏的方法是使用以下方式定义它们:
#[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_use] mod macros
等的各种组合,但都没有成功。该文档建议如果在某个范围内定义了一个宏,那么它在所有子模块中都可用...这是否意味着我必须在 lib.rs 中定义我的宏?
您需要用 #[macro_export]
标记宏,然后用 #[macro_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());
}
从技术上讲,如果您希望您的 crate 用户可以使用宏,则只需要使用 #[macro_export]
。
接受的答案是正确的,但对于以后发现此问题的任何其他人,我想补充一点,加载模块的 order 很重要。
例如,在这个序列中:
pub mod terminal;
pub mod terminals;
pub mod graphics;
#[macro_use]
mod macros;
如果终端使用宏中的宏,它将不工作; #[macro_use]
必须出现在任何其他使用宏的模块之上:
#[macro_use]
mod macros;
pub mod terminal;
pub mod terminals;
pub mod graphics;
我确信这很容易做到,但我似乎无法让它发挥作用。
我看过 http://doc.rust-lang.org/book/advanced-macros.html#scoping-and-macro-import/export,我很欣赏,一般来说,使用宏的方法是使用以下方式定义它们:
#[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_use] mod macros
等的各种组合,但都没有成功。该文档建议如果在某个范围内定义了一个宏,那么它在所有子模块中都可用...这是否意味着我必须在 lib.rs 中定义我的宏?
您需要用 #[macro_export]
标记宏,然后用 #[macro_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());
}
从技术上讲,如果您希望您的 crate 用户可以使用宏,则只需要使用 #[macro_export]
。
接受的答案是正确的,但对于以后发现此问题的任何其他人,我想补充一点,加载模块的 order 很重要。
例如,在这个序列中:
pub mod terminal;
pub mod terminals;
pub mod graphics;
#[macro_use]
mod macros;
如果终端使用宏中的宏,它将不工作; #[macro_use]
必须出现在任何其他使用宏的模块之上:
#[macro_use]
mod macros;
pub mod terminal;
pub mod terminals;
pub mod graphics;