我有一个太大的宏,所以我想将部分代码提取到一个函数中。当我这样做时,我遇到了一个问题,因为当在呼叫站点扩展宏时,该函数不在范围内:
#[macro_use]
mod macros {
fn hi() {
println!("Hello")
}
#[macro_export]
macro_rules! say_hi {
() => {
hi();
};
}
}
fn main() {
say_hi!();
}
这不编译:
error[E0425]: cannot find function `hi` in this scope
--> src/main.rs:10:13
|
10 | hi();
| ^^ not found in this scope
...
16 | say_hi!();
| ---------- in this macro invocation
|
help: possible candidate is found in another module, you can import it into scope
|
15 | fn main() use macros::hi;
|
我尝试将hi
公开(虽然我不想),但由于它不是在调用者的上下文中导入的,所以它无论如何都不起作用。
我该如何解决这个问题?
答案 0 :(得分:2)
第一个问题是在宏的调用者的上下文中,除非该函数是公共的,否则该函数是不可见的,因此我担心它不可能从中调用非pub函数宏。
另一个问题是宏引用的函数应该始终使用它们的完全限定路径(以便它们可以在任何上下文中工作)。假设函数hi
是pub
,这将起作用:
#[macro_export]
macro_rules! say_hi {
() => {
$crate::macros::hi();
};
}
注意:使用
$crate
确保宏从任何包中使用时都可以使用,有关详细信息,请参阅$crate documentation。