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

What's the difference between a macro and a compiler plugin?

宏可以做什么编译器插件不能,反之亦然?

"can not",我的意思是不可能达到同样的目的,而不是换一种方式可以达到。

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

编译器插件宏可以做所有 macro_rules! 宏可以做的事情,还有更多。编译器插件可以注册推导宏,合成新的标识符,解构AST节点,解析字符串,做文件IO, 罗列一切都会毫无意义,因为这相当于复制内部编译器 API,它会定期更改。

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

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