Macros 如何使用重新导出的板条箱中的宏

Macros 如何使用重新导出的板条箱中的宏,macros,rust,Macros,Rust,板条箱可以再出口它们所依赖的板条箱。在本例中,stm32f103xx hal板条箱执行以下操作:pub extern板条箱stm32f103xx 在我的代码中,我依赖于stm32f103xx hal。现在我想使用中断!()宏,由stm32f103xx板条箱导出。我是否必须将stm32f103xx板条箱依赖项添加到我的Cargo.toml,或者是否有办法重新使用导出的stm32f103xx hal定义 请注意,这与简单的“如何使用不同板条箱中的宏”不同。在stm32f103xx hal上声明#[m

板条箱可以再出口它们所依赖的板条箱。在本例中,
stm32f103xx hal
板条箱执行以下操作:
pub extern板条箱stm32f103xx

在我的代码中,我依赖于
stm32f103xx hal
。现在我想使用
中断!()
宏,由
stm32f103xx
板条箱导出。我是否必须将
stm32f103xx
板条箱依赖项添加到我的Cargo.toml,或者是否有办法重新使用导出的
stm32f103xx hal
定义


请注意,这与简单的“如何使用不同板条箱中的宏”不同。在
stm32f103xx hal
上声明
#[macro\u use(interrupt)]
将产生一个
找不到宏“interrupt!”在此范围内
错误。

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

例如,在柴油机上

他们将
#[macro_use]
放在外部板条箱行上,然后使用
柴油机项目中的所有内容

在您的情况下,结果如下所示:

pub extern crate stm32f103xx;
因此,重新导出不会指定宏的使用


这就是为什么您需要将
stm32f103xx
添加到您的Cargo.toml中,以便在您自己的
lib.rs

中指定宏的使用。中间板条箱应重新导出宏,以便它们可用:

mac/src/lib.rs

#[macro_export]
macro_rules! a_macro {
    () => (42);
}
pub extern crate mac;
pub use mac::*; // Re-export the macros
inter/src/lib.rs

#[macro_export]
macro_rules! a_macro {
    () => (42);
}
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!());
}

在您的情况下,要么是库中的错误,要么是他们故意决定不重新导出它们,所以您需要与他们一起解决。您可以选择直接依赖基础板条箱,但随后您会发现板条箱的版本不匹配,从而导致恼人的错误。

这是最近更改为使用通用导入系统

假设您想使用
中断宏从
foo
板条箱中,执行此操作的新方法如下所示:

#![feature(use_extern_macros)];

pub use foo::interrupt;

请注意,这还不稳定,因此它是
使用外部宏后的功能门控

可能重复的
中断!()
宏工作,如果您像这样导入
stm32f103xx hal
#[macro\u use]外部板条箱stm32f103xx hal
?发现了一些关于现已失效的“macro_reexport”功能的附加讨论,这似乎与当前的问题非常相关:这是有道理的,尽管这样设计货物似乎有点脆弱。谢谢。@MichaelBöckling它的“脆弱”是什么?您正在使用的板条箱选择不导出(或忘记导出)宏。你想让Cargo怎么办?忽略编写的代码,随便输入它感觉如何?好吧,他们可能会忘记导出宏。这个板条箱已经决定了它的公开API表面,为什么另一个再出口它的板条箱在这件事上有发言权呢?@MichaelBöckling,因为他们选择再出口的东西成为了他们API表面的一部分。Shepmaster在这里提出了一个很好的观点。在您的情况下,即使板条箱
stm32f103xx hal
将从
stm32f103xx
重新导出宏,最好的做法是导入
stm32f103xx
明确允许您指定所需的版本。@KimDesrosiers我相信您完全理解我的意思。我的意思是,由于版本不兼容,依赖于重新导出的板条箱和直接使用板条箱是一个坏主意。您应该只使用重新导出的代码(不能使用,因为它当前没有导出宏)。这不是“显式导入
stm32f103xx
的最佳实践”,因为您无法控制
stm32f103xx hal
使用的版本。我读最后一句话太快了,真糟糕。然而,也许这不是一个好的实践,但在目前的情况下,如果我们想使用宏,我们没有选择。是否可以在同一项目中使用两种不同版本的板条箱?我的意思是,我们可以在需要的地方给转口商品加上别名,并使用我们货物中的另一个。toml?@KimDesrosiers如果你指的是“当前情况”作为这两个特定板条箱的当前状态,那么是的,你必须直接或间接地包括板条箱,这对你自己的未来不利。这就是为什么我鼓励OP向板条箱提交问题。另外,您不能在Cargo.toml中指定同一板条箱的两个版本,但在整个板条箱依赖关系图中可以有多个版本的板条箱。请看一个具体的例子。明确地公开一个问题将是正确的做法。