假设我的模块中有以下代码:
struct A{
}
#[macro_export]
macro_rules! profile {
($variable_name:tt, $expression:expr) => {
let a = A{};
}
}
Run Code Online (Sandbox Code Playgroud)
所以它会在a/a.rs, 的一侧a/mod.rs导出a::A并导出宏。
问题是,当我在其他模块(例如 )上使用此宏时b/b.rs,我必须use super::a::A在使用该宏之前。
我可以let a = A{};将宏更改为let a = self::a::A{};. 但是,它不适用于所有模块,当然也不适用于在代码中使用该库的该库的用户。
我如何指定let a = something::something::A{};它可以在我的库中的任何位置以及该库的用户中工作?
具体来说,在声明性宏中,您可以使用$crate元变量来引用定义宏的包,然后使用该项目的绝对路径。这在图书馆内部和外部都适用。例如,如果您的结构体A在库中的 path 处定义module_a::module_b::A,您将使用:
struct A{
}
#[macro_export]
macro_rules! profile {
($variable_name:tt, $expression:expr) => {
let a = $crate::module_a::module_b::A{};
}
}
Run Code Online (Sandbox Code Playgroud)