2016-09-17 145 views
3

宏可以做什么,编译器插件不能,反之亦然? “不能”,我的意思是不可能达到相同的目的,并不是说它可以以不同的方式实现。宏和编译器插件有什么区别?

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

+0

只有编译器扩展才可能扩展现有语法,而不使用宏调用。例如。创造新的“派生”特征。 –

回答

2

编译插件宏可以做任何事情macro_rules!宏可以做,再加上更多。编译器插件可以注册派生宏,合成新标识符,解析AST节点,解析字符串,执行文件IO,等。,列出所有内容都是毫无意义的,因为它可以重现内部编译器API,定期进行。

关于唯一的主要限制是它们只能访问它们被调用的内容,或者可以从它们被调用的内容(除了一些额外的,已经存在的上下文信息)获得它们:它们不能访问或与任何尚不存在的东西一起工作。像类型,或者什么名字的意思,或者表达式有什么价值。

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

相关问题