在宏扩展中引用外部板条箱

Refer to an extern crate in macro expansion

提问人:digital illusion 提问时间:3/30/2022 更新时间:3/30/2022 访问量:673

问:

我正在尝试编写一些在 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。如何在宏扩展中引用外部板条箱?使用似乎在里面不起作用。$cratequote!

Rust alloc

评论

0赞 Chayim Friedman 3/30/2022
将其添加到每个扩展中有什么问题?
0赞 digital illusion 3/30/2022
错误 [E0259]: 多次定义名称alloc
1赞 Chayim Friedman 3/30/2022
如果将每个扩展都包装在一个块中,它就会起作用。

答:

3赞 Chayim Friedman 3/30/2022 #1

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

对于需要辅助类型的 proc 宏,另一种常见做法是创建一个提供辅助类型的 crate,然后从中重新导出宏。例如 create 和 .然后,如果您只需要 -accessible 类型,则可以摆脱整个功能,例如:mycratemycrate-macrosallocalloc

#![no_std]

extern crate alloc;

#[doc(inline)]
pub use mycrate_macros::my_macro;

#[doc(hidden)]
pub use alloc:borrow::Cow;

然后在宏中引用 。::my_crate::Cow