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



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

我遇到了一些问题:

#[proc_macro_derive]属性仅适用于proc-macro板条箱类型的板条箱

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

proc-macro箱类型无法导出当前标记为#[proc_macro_derive]的功能以外的任何项目 标记为#[proc_macro_derive]的函数当前必须位于板条箱的根部

这种行为的原因是什么?

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

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

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

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

关于此限制:

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

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

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

关于这个其他限制:

标记为#[proc_macro_derive]的函数当前必须驻留在板条箱的根目录中

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

最新更新