如何使用重新导出的包装箱中的宏

时间:2018-04-26 07:21:31

标签: macros rust

Crates可以重新出口他们所依赖的板条箱。在此示例中,stm32f103xx-hal包就是:pub extern crate stm32f103xx;

在我的代码中,我依赖于stm32f103xx-hal。现在我想使用interrupt!()包导出的stm32f103xx宏。我是否必须向我的Cargo.toml添加stm32f103xx crate依赖项,或者是否有办法重新使用stm32f103xx-hal的导出定义?

请注意,这与“如何使用来自不同箱子的宏”的问题完全不同。在#[macro_use(interrupt)]上声明stm32f103xx-hal会产生cannot find macro 'interrupt!' in this scope错误。

3 个答案:

答案 0 :(得分:2)

我认为您需要将stm32f103xx添加到Cargo.toml。原因如下:

例如,在Diesel lib.rs

#[macro_use]
extern crate diesel_derives;
#[doc(hidden)]
pub use diesel_derives::*;

他们将#[macro_use]放在extern crate line上,然后他们使用diesel_derives项目中的所有内容。

在您的情况下,lib.rs看起来像这样:

pub extern crate stm32f103xx;

因此,重新导出不会指定使用宏。

这就是为什么您需要将stm32f103xx添加到Cargo.toml中以指定在您自己的lib.rs中使用宏的原因。

答案 1 :(得分:1)

中间条件箱应该重新导出宏以便它们可用:

MAC / SRC / lib.rs

#[macro_export]
macro_rules! a_macro {
    () => (42);
}

帧间/ SRC / lib.rs

pub extern crate mac;
pub use mac::*; // Re-export the macros

EX / SRC / main.rs

#[macro_use]
extern crate inter;

fn main() {
    println!("Hello, {}", a_macro!());
}

在您的情况下,它或者是图书馆的错误,或者他们故意决定不再重新导出它们,因此您需要将它们与它们一起使用。您可以选择直接依赖底层板条箱,但随后您可能会遇到不匹配的箱子版本,从而导致恼人的错误。

答案 2 :(得分:0)

最近刚改变使用通用导入系统。

假设您要使用SELECT * FROM `hotel_tax_details` WHERE `start_range_cost`<=2500 AND `end_range_cost`>=2500 包中的interrupt!宏,新方法就是这样:

foo

请注意,这还不稳定,因此它是#![feature(use_extern_macros)]; pub use foo::interrupt; 后面的功能门控。