在宏扩展中引用一个 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 宏的另一种常见做法是创建一个提供它们的板条箱,然后从中重新导出宏。例如。创建 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
。
我正在尝试编写一些在 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 宏的另一种常见做法是创建一个提供它们的板条箱,然后从中重新导出宏。例如。创建 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
。