现实生活场景:
我想用crate::app::verbose_trace!("string literal")
inside crate::app::args::parse
module.
可重现的场景:
经过一个小时的尝试,我得到了以下简单的例子。
它暴露了我对宏的误解。
#[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
I read:
- https://riptutorial.com/rust/example/5647/exporting-and-importing-macros
- and partially:
- 如何在 Rust 的子模块中导入宏?
- 如何在 Rust 中导入宏?
我想看看:
- 我的示例的可编译版本。
- 解释为什么编译失败。
- Optionally:
- 关于如何在子模块/超级模块中使用 marco 的其他一些建议。
#[macro_export]
导出宏在板条箱根下. Thus, crate::baz!()
会起作用,但是foo::baz!()
不会(而且你不需要#[macro_use]
,它用于在另一个板条箱中使用宏)。
如果你想导出宏在这条路上,对于板条箱本地宏不要使用#[macro_export]
所有。相反,导出宏,如下所示:
macro_rules! baz {
() => {
println!("baz works")
};
}
pub(crate) use baz;
要导出宏以在其他板条箱中使用,您仍然需要#[macro_export]
:
#[macro_export]
macro_rules! baz {
() => {
println!("baz works")
};
}
pub use baz;
这将在板条箱根目录下和foo
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)