为什么必须在proc-macro crate中定义proc-macros?

时间:2019-06-22 08:28:41

标签: rust language-lawyer rust-macros

我正在尝试为我的特征创建一个派生宏,以简化某些内容。

我遇到了一些问题:

the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type

,然后在进行小修补proc-macro=true之后:

proc-macro` crate types cannot export any items other than functions tagged with `#[proc_macro_derive]` currently
functions tagged with `#[proc_macro_derive]` must currently reside in the root of the crate`

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:8)

过程宏与代码中的常规依赖项根本不同。普通库只是链接到您的代码中,而过程宏实际上是编译器 plugin

考虑交叉编译的情况:您正在Linux机器上工作,但是正在构建WASM项目。

  • 普通板条箱将被交叉编译,生成WASM代码并与其余板条箱链接。
  • proc-macro板条箱必须在本地编译,在这种情况下为Linux代码,并与当前的编译器运行时(稳定,beta,夜间)链接,并在编译板条箱的实际位置时由编译器本身加载。它不会链接到其余的板条箱(不同的架构!)。

而且由于编译流程不同,所以包装箱类型也必须不同,这就是为什么需要proc_macro=true的原因。

关于此限制:

  

proc-macro的板条箱类型不能导出除带有#[proc_macro_derive]标记的功能之外的任何项目

好吧,由于proc-macro板条箱是由编译器加载的,没有链接到其余的板条箱,因此,从此板条箱导出的任何非proc-macro代码都将无用。

请注意,错误消息不准确,因为您还可以使用#[proc_macro]导出函数tagget。

关于其他限制:

  

标记为#[proc_macro_derive]的功能当前必须位于板条箱的根部

恕我直言,目前不支持在嵌套模块中添加proc_macroproc_macro_derive项,并且似乎并不是特别有用。

相关问题