22

我试图为我的特征创建一个派生宏,以简化一些东西。

我遇到了一些问题:

#[proc_macro_derive]属性仅适用于proc-macrocrate 类型的 crate

并且,在小修复之后proc-macro=true

proc-macrocrate类型不能导出除带有#[proc_macro_derive]当前标记的函数之外的任何项目#[proc_macro_derive]

这种行为的原因是什么?

4

1 回答 1

30

过程宏与代码中的正常依赖关系根本不同。一个普通的库只是链接到您的代码中,但程序宏实际上是一个编译器插件

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

  • 一个普通的 crate 将被交叉编译,生成 WASM 代码并与其余的 crate 链接。
  • proc-macro crate 必须在本机编译,在本例中为 Linux 代码,与当前编译器运行时(稳定、beta、nightly)链接,并在编译实际使用的 crate 时由编译器本身加载。它不会链接到其余的板条箱(不同的架构!)。

而且由于编译流程不同,crate 类型也必须不同,这就是proc_macro=true需要的原因。

关于此限制:

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

好吧,由于 proc-macro crate 是由编译器加载的,而不是链接到您的其余 crate,因此您从该 crate 导出的任何非 proc-macro 代码都是无用的。

请注意,错误消息是不准确的,因为您也可以导出函数 tagget #[proc_macro]

关于这个其他限制:

标记为的函数#[proc_macro_derive]当前必须位于 crate 的根目录中

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

于 2019-06-22T09:24:38.487 回答