宏可以做什么,编译器插件不能,反之亦然?
“不能”,我的意思是不可能达到同样的目的,而不是以不同的方式实现。
例如,一个宏可以impl
某个结构的特征,编译器插件可以derive
结构的某些特征。它们都可以自动impl
结构的特征。
答案 0 :(得分:2)
编译器插件宏可以完成macro_rules!
个宏可以做的所有事情,还有更多。编译器插件可以注册派生宏,合成新标识符,解构AST节点,解析字符串,执行文件IO,等。,等。列出一切都没有意义,因为它会相当于重现内部编译器API,它会定期更改。
关于唯一的主要限制是他们只能访问他们所调用的内容,或者可以从他们调用的内容中获取(除了一些额外的,已经存在的上下文信息):他们无法访问或工作任何尚未存在的东西。类似于类型,或者名称的含义,或者表达式具有什么价值。
嗯,好吧,有一个的东西,编译器插件不能做那个宏可以:在不同版本的编译器上稳定工作。 (然而。)