有哪些宏可以做编译器插件做不到的事情,反之亦然?
“不能”是指不可能达到同样的目的,而不是可以通过不同的方式达到。
例如,宏可以impl
struct 的某些特征,编译器插件可以derive
struct 的某些特征。它们都可以自动impl
结构的特征。
最佳答案
编译器插件宏可以做所有 macro_rules!
宏可以做的事情,还有更多。编译器插件可以注册派生宏,合成新的标识符,解构 AST 节点,解析字符串,做文件 IO,etc.,etc.相当于重现定期更改的内部编译器 API。
唯一的主要限制是它们只能访问它们被调用的内容,或者可以从它们被调用的内容派生的内容(除了一些额外的、已经存在的上下文信息之外):它们无法访问或工作与任何尚不存在的东西。比如类型,或者名称的含义,或者表达式的值。
好吧,有一个编译器插件不能做而宏可以做的事情:跨不同版本的编译器稳定工作。 (还有。)
关于macros - 宏和编译器插件有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39550060/