gpt4 book ai didi

module - 如何跨模块文件使用宏?

转载 作者:行者123 更新时间:2023-12-03 11:48:02 29 4
gpt4 key购买 nike

我在同一个 crate 中的不同文件中有两个模块,其中 crate 有 macro_rules启用。我想在另一个模块中使用一个模块中定义的宏。

// macros.rs
#[macro_export] // or not? is ineffectual for this, afaik
macro_rules! my_macro(...)

// something.rs
use macros;
// use macros::my_macro; <-- unresolved import (for obvious reasons)
my_macro!() // <-- how?

我目前遇到了编译器错误“ macro undefined: 'my_macro'”......这是有道理的;宏系统在模块系统之前运行。我该如何解决这个问题?

最佳答案

同一个 crate 中的宏
新方法(自 Rust 1.32,2019-01-17 起)

foo::bar!();  // works

mod foo {
macro_rules! bar {
() => ()
}

pub(crate) use bar; // <-- the trick
}

foo::bar!(); // works
pub use , 宏可以像任何其他项目一样使用和导入。并且与旧方法不同,这不依赖于源代码顺序,因此您可以使用之前定义的宏(源代码顺序)。
旧方法
bar!();   // Does not work! Relies on source code order!

#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}

bar!(); // works
如果要在同一个 crate 中使用宏,定义宏的模块需要属性 #[macro_use] .注意宏只能用 之后 他们已经被定义了!

跨箱子的宏
crate util
#[macro_export]
macro_rules! foo {
() => ()
}
crate user
use util::foo;

foo!();
请注意,使用此方法,宏始终位于 crate 的顶层!所以即使 foo将在 mod bar {} 内, user crate 仍然需要写 use util::foo;而不是 use util::bar::foo; .通过使用 pub use ,您可以从 crate 的模块中导出宏(除了在根目录中导出)。
在 Rust 2018 之前,您必须通过添加属性 #[macro_use] 从其他 crate 导入宏到 extern crate util;陈述。这将从 util 导入所有宏.不再需要此语法。

关于module - 如何跨模块文件使用宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63233545/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com