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中指定同一板条箱的两个版本,但在整个板条箱依赖关系图中可以有多个版本的板条箱。请看一个具体的例子。明确地公开一个问题将是正确的做法。