首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏/语法扩展/编译器插件有哪些类型?

宏/语法扩展/编译器插件有哪些类型?
EN

Stack Overflow用户
提问于 2016-12-18 21:33:55
回答 1查看 594关注 0票数 10

我对锈菌生态系统中的几个宏类事物所使用的许多术语感到非常困惑。有人能澄清哪些宏/语法扩展/编译器插件,以及解释这些术语之间的关系吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-18 21:33:55

你说得对:这令人困惑。特别是,因为这些特性大多是不稳定的,并且经常发生变化。但我将试图总结一下目前的形势(2016年12月)。

让我们从语法扩展开始:它必须被“调用”或手动注释才能产生任何效果。有三种语法扩展,它们的注释方式不同:

  • 函数类语法扩展:这些可能是最常见的语法扩展,也称为“宏”。调用它们的语法是foo!(…)或(这是非常罕见的) foo! some_ident (…),其中foo是宏的名称。注意,()括号可以替换为[]{}。类似函数的语法扩展可以定义为“宏按例”,也可以定义为“过程宏”。
  • 属性类语法扩展:在不需要括号的情况下,这些扩展被调用为#[foo(…)],而foo也是语法扩展的名称。属性所属的项随后可以通过附加项(装饰符)进行修改或扩展。
  • 自定义派生:大多数锈菌程序员已经使用了#[derive(…)]属性。当然,derive本身可以看作是类似属性的语法扩展。但是也可以扩展它,然后像#[derive(Foo)]一样调用它,其中Foo是自定义派生的名称。

这些语法扩展大多也是“编译器插件”。唯一的例外是类似函数的语法扩展,它是通过“宏按例”(意为macro_rules!语法)定义的。宏示例可以在源代码中定义,而无需编写编译器插件。

但是也有一些编译器插件不是语法扩展。这些类型的编译器插件是在编译过程的某个阶段运行一些代码的指针或其他插件。它们不需要手动调用:一旦加载,编译器将在编译过程中的某些点调用它们。

所有编译器插件都需要加载--无论是通过机箱处的#![plugin(foo)]根还是使用-Zextra-plugins=too,bar命令行参数--才能产生任何效果!

编译器插件目前是不稳定的,因此您需要一个夜间编译器来使用它们.但是“宏1.1"-RFC可能很快就会稳定下来,这意味着可以在稳定的编译器中使用一小部分编译器插件。

有用的链接:

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41213127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档