提问人:digital illusion 提问时间:3/30/2022 更新时间:3/30/2022 访问量:673
在宏扩展中引用外部板条箱
Refer to an extern crate in macro expansion
问:
我正在尝试编写一些在 nostd 环境和 std 环境中工作的宏。为了做到这一点,我在 proc macro crate 中有这种代码:
#[cfg(not(feature = "alloc"))]
{
quote!(err.message = Some(::std::borrow::Cow::from(#m));)
}
#[cfg(feature = "alloc")]
{
quote!(err.message = Some(::alloc::borrow::Cow::from(#m));)
}
当启用 alloc 功能时,这会正确生成使用 alloc 的代码,但编译器会抱怨
error[E0433]: failed to resolve: could not find `alloc` in the list of imported crates
当然,究其原因,是缺少了宏观扩张
extern crate alloc;
但添加这是一个问题。由于它是一个过程派生宏,因此将在每次派生调用时添加外部 crate。如何在宏扩展中引用外部板条箱?使用似乎在里面不起作用。$crate
quote!
答:
3赞
Chayim Friedman
3/30/2022
#1
您可以将扩展包装在一个块中,然后可以多次定义。alloc
对于需要辅助类型的 proc 宏,另一种常见做法是创建一个提供辅助类型的 crate,然后从中重新导出宏。例如 create 和 .然后,如果您只需要 -accessible 类型,则可以摆脱整个功能,例如:mycrate
mycrate-macros
alloc
alloc
#![no_std]
extern crate alloc;
#[doc(inline)]
pub use mycrate_macros::my_macro;
#[doc(hidden)]
pub use alloc:borrow::Cow;
然后在宏中引用 。::my_crate::Cow
评论
alloc