1 个不稳定版本
0.1.0 | 2022 年 4 月 15 日 |
---|
#16 in #visibility
每月 57 次下载
在 4 个 crate 中使用 (通过 awaur)
19KB
243 行
#[macro_pub]
是 #[macro_export]
的替代品,它为 macro_rules!
宏提供常规可见性规则。
如果您想让宏不具有全局公开的可见性,则可以在属性中使用 pub(in path)
语法,例如 #[macro_pub(crate)]
。
如何
如果您使用一个遗留的作用域宏,它“挂载”它到常规可见性,并可以从那时起作为一个常规项使用。所以当您写
#[macro_pub(crate)]
macro_rules! my_macro {
() => {};
}
它扩展为类似
macro_rules! macro_impl_279137529572831871236407390024221977230_my_macro {
() => {};
}
pub(crate) use macro_impl_279137529572831871236407390024221977230_my_macro
as my_macro;
哈希是注解项的 TokenStream
的 XXH3 哈希,并包含在内以防止在宏命名空间中的名称冲突。
如果您没有指定 pub(in path)
限制,则您将获得一个全局可见的宏
#[macro_export]
#[doc(hidden)]
macro_rules! macro_impl_279137529572831871236407390024221977230_my_macro {
() => {};
}
pub use macro_impl_279137529572831871236407390024221977230_my_macro
as my_macro;
记录公开宏
不幸的是,实际的宏实现上的 #[doc(hidden)]
隐藏了任何附加到它的文档,将 #[doc(inline)]
应用于 use
只会使它也变得隐藏,并且无法附加文档。因此,在稳定版本中,您的宏将像重新导出一样包含在文档中
pub use macro_impl_279137529572831871236407390024221977230_my_macro
as my_macro;
和 macro_impl_279137529572831871236407390024221977230_my_macro
不会进行记录。
如果您正在使用nightly版本,我们可以利用nightly版本中的功能来记录宏。为了在nightly版本中记录您的crate,#[macro_pub]
需要#![cfg_attr(doc, feature(decl_macro, rustc_attrs))]
,然后输出
#[cfg(doc)]
#[rustc_macro_transparency = "semitransparent"]
pub macro my_macro {
() => {},
}
#[cfg(not(doc))]
// the previous expansion
这使用了不稳定的新版“宏2.0”来定义宏,使用传统的macro_rules!
规则,遵循正常的命名空间规则,并通过rustdoc进行清晰的文档记录。
macro_pub
会自动检测您正在使用的rustc编译器,以确定是否可以以这种方式使用decl_macro和rustc_attrs。当这些功能不可避免地发生变化时,macro_pub
会自动回退到稳定解决方案。另外,如果直接解决这个问题的方式得到稳定(例如,pub macro_rules!
,该功能几乎与这个crate做完全相同的事情),macro_pub
将更新以利用兼容的rustc版本。
示例
在一个具有pub(crate)
可见性的模块中
#[macro_use]
extern crate macro_pub;
mod test {
#[macro_pub(crate)]
macro_rules! m {
() => {};
}
}
test::m!();
具有pub(self)
可见性的,不能在模块外部访问
#[macro_use]
extern crate macro_pub;
# fn main() {}
mod test {
#[macro_pub(self)]
macro_rules! m {
() => {};
}
}
test::m!(); //~ ERROR
依赖项
~97KB