3

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

“不能”,我的意思是不可能达到相同的目的,而不是可以用不同的方式来达到。

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

4

1 回答 1

2

编译器插件宏可以做所有macro_rules!宏可以做的事情,还有更多。编译器插件可以注册派生宏、合成新标识符、解构 AST 节点、解析字符串、执行文件 IO等列出 所有内容将毫无意义,因为它相当于复制内部编译器 API,它会定期更改.

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

好吧,好的,编译器插件无法做到宏可以做到的一件事:跨不同版本的编译器稳定工作。然而。

于 2016-09-18T02:33:20.783 回答