在最近的项目中,我一直在编写很多宏。我只是在考虑Rust的模块系统对管理“命名空间”有多么有用,我开始怀疑:

  • 为什么决定宏不也应该遵守模块系统?是因为使用宏指令的普遍性很罕见吗?还是由于其他一些基本的编译过程对其进行了限制?
  • 是否可以“命名空间” Rust宏?

  • 这个问题不是由迫切的需求引起的,而更多是由好奇心引起的:-)

    最佳答案

    宏扩展在“模块系统”之前运行,因此此时尚未真正进行名称解析/搜索。而且,宏实际上可以创建整个模块,因此不一定要使整个解析系统都能正常工作。这也是按声明顺序运行宏的部分原因(这是Rust中真正重要的唯一位置),因此可以预定义名称和宏的顺序。

    因此,存在一些技术问题。但是,至少拥有某种形式的命名空间宏确实很棒。

    在 crate 之间绝对有可能(并且本质上是必要的)进行命名空间调整,也就是说,如果 crate ab都定义了foo!,则应使以下内容合法

    #![feature(phase)]
    
    #[phase(plugin)] extern crate a;
    #[phase(plugin)] extern crate b;
    
    fn main() {
        a::foo!();
        b::foo!();
    }
    

    目前尚未实现,但希望最终会有这种形式的东西。



    总结:否,除了通过C-namespacing:mylib_mymodule_mymacro!()

    关于macros - 是否可以 "namespace"Rust宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24794821/

    10-16 17:16