现实生活场景:
我想在crate::app::args::parse
模块内使用crate::app::verbose_trace!("string literal")
。
可重现的场景:
经过一个小时的尝试,我得出了以下简单示例。它揭示了我对宏的误解。
#[macro_use]
mod foo{
pub fn bar(){
println!("bar works")
}
#[macro_export]
macro_rules! baz{
()=> {println!("baz works")}
}
}
fn main(){
foo::bar();
foo::baz!();
// Following doesn't work either:
// use foo::baz;
// baz!();
}
编译器报错
error[E0433]: failed to resolve: could not find `baz` in `foo`
--> src\main.rs:14:14
|
14 | foo::baz!();
| ^^^ could not find `baz` in `foo`
好像它完全盲目 :0
我阅读了:
我想看到:
- 一个可编译的版本的我的示例。
- 为什么它无法编译的解释。
- 可选的:
- 关于如何在子模块/超模块中使用宏的其他建议。
macro_rules
(只能使用宏2.0)。但是你可以使用一个技巧:导出一个带有#[doc(hidden)]
混淆名称的宏(比如module__macro
),然后从模块重新导出具有公共名称的宏。 - Chayim Friedman#[macro_export] #[doc(hidden)] macro_rules! foo__bar { ... } pub use foo_bar as bar;
。 - Chayim Friedman