如何在任何使用它的地方进行宏导入/使用结构?

Gue*_*OCs 4 rust

假设我的模块中有以下代码:

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{};它可以在我的库中的任何位置以及该库的用户中工作?

ape*_*lla 6

具体来说,在声明性宏中,您可以使用$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)

这是 Rust 参考指南的相关部分