如何在宏中使用非公共函数?

时间:2017-10-09 20:53:13

标签: rust

我有一个太大的宏,所以我想将部分代码提取到一个函数中。当我这样做时,我遇到了一个问题,因为当在呼叫站点扩展宏时,该函数不在范围内:

#[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公开(虽然我不想),但由于它不是在调用者的上下文中导入的,所以它无论如何都不起作用。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

第一个问题是在宏的调用者的上下文中,除非该函数是公共的,否则该函数是不可见的,因此我担心它不可能从中调用非pub函数宏。

另一个问题是宏引用的函数应该始终使用它们的完全限定路径(以便它们可以在任何上下文中工作)。假设函数hipub,这将起作用:

#[macro_export]
macro_rules! say_hi {
    () => {
        $crate::macros::hi();
    };
}
  

注意:使用$crate确保宏从任何包中使用时都可以使用,有关详细信息,请参阅$crate documentation