如何从同一个板条箱中的不同模块导入/使用宏?

2023-12-12

现实生活场景:

我想用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(使用前将#替换为@)

如何从同一个板条箱中的不同模块导入/使用宏? 的相关文章

随机推荐