macros - 宏和编译器插件有什么区别?

标签 macros rust rust-compiler-plugin

有哪些宏可以做编译器插件做不到的事情,反之亦然?

“不能”是指不可能达到同样的目的,而不是可以通过不同的方式达到。

例如,宏可以impl struct 的某些特征,编译器插件可以derive struct 的某些特征。它们都可以自动impl结构的特征。

最佳答案

编译器插件宏可以做所有 macro_rules! 宏可以做的事情,还有更多。编译器插件可以注册派生宏,合成新的标识符,解构 AST 节点,解析字符串,做文件 IO,etc.etc.相当于重现定期更改的内部编译器 API。

唯一的主要限制是它们只能访问它们被调用的内容,或者可以从它们被调用的内容派生的内容(除了一些额外的、已经存在的上下文信息之外):它们无法访问或工作与任何尚不存在的东西。比如类型,或者名称的含义,或者表达式的值。

好吧,有一个编译器插件不能做而宏可以做的事情:跨不同版本的编译器稳定工作。 (还有。)

关于macros - 宏和编译器插件有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39550060/

相关文章:

c - if else C语言的简写

rust - 为什么 `regex!` 不是 `Regex::new` 的包装器以提供相同的正则表达式匹配速度?

if 条件下的 C 宏

error-handling - 接受 Result<T, E> 作为函数参数是惯用的 Rust 吗?

string - 有没有办法在将迭代器映射到更大的切片内取消引用切片?

arrays - 使用 const 泛型将可变指针数组转换为可变引用

rust - 如何在编译器插件中获取结构体字段和字段类型?

c++ - 为什么不建议在头文件中定义宏?

C中的计算包含