我在最近的一个项目中写了很多宏。我只想到Rust的模块系统用于管理"命名空间"是多么令人难以置信的有用,我开始怀疑:
为什么决定宏不应该遵守模块系统?是因为宏观使用普遍罕见吗?还是因为其他一些限制它的基本编译过程?
是否可以"命名空间" Rust宏?
这个问题不是出于迫切的需要,而是来自一般的好奇心: - )
答案 0 :(得分:9)
宏扩展在"模块系统"之前运行,因此名称解析/搜索在该点没有真正设置。此外,宏实际上可以创建整个模块,因此不一定可能使整个分辨率系统工作。这也是宏以声明顺序运行的原因之一(Rust中唯一真正重要的地方),因此可以定义名称和宏的可预测顺序。
因此,存在一些技术问题。然而,至少有某种形式的命名空间宏,真的很好。
绝对有可能(并且基本上是必要的)在包装箱之间设置命名空间,也就是说,如果包装箱a
和b
都定义foo!
,那么以下应该能够合法化
#![feature(phase)]
#[phase(plugin)] extern crate a;
#[phase(plugin)] extern crate b;
fn main() {
a::foo!();
b::foo!();
}
这还没有实现,但我们希望最终会有这种形式。
是否可以"命名空间" Rust宏?
总结:不,除了通过C-namespacing:mylib_mymodule_mymacro!()
。