在宏扩展中引用一个 extern crate

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;

但是添加那个是个问题。因为它是一个过程派生宏,所以 extern crate 将被添加到每个派生调用中。我如何在宏扩展中引用外部板条箱?在 quote!.

中使用 $crate 似乎不起作用

您可以将扩展包装在一个块中,然后您可以多次定义alloc

需要辅助类型的 proc 宏的另一种常见做法是创建一个提供它们的板条箱,然后从中重新导出宏。例如。创建 mycratemycrate-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