如何在Rust的子模块中导入宏?

jz8*_*z87 23 rust

我有以下目录结构

  • /main.rs
  • /lib.rs
  • /tutorial/mod.rs
  • /tutorial/foo.rs

foo.rs我需要使用glium库中的宏,implement_vertex!.如果我放在#[macro_use] extern crate glium;头上foo.rs,我会得到一个error: an `extern crate` loading macros must be at the crate root.我也得到了error: macro undefined: 'implement_vertex!'

还有一个lib.rs是教程模块的包根.我需要放在#[macro_use]那里.如果我同时拥有它们main.rs,这会创建2个箱子根lib.rs吗?

在子模块中导入宏的正确方法是什么?

小智 14

宏在编译阶段足够早地处理,命令很重要.你和我一样,可能已经变得很好并习惯了Rust,因为需要关心你的使用顺序和crate声明.

根据需要将#[macro_use] extern crate glium;语句移动到您lib.rs和/或main.rs文件的顶部.


Luk*_*odt 5

就像编译器告诉您的那样:

an `extern crate` loading macros must be at the crate root

将放在您的情况下#[macro_use] extern crate glium;的板条箱根main.rs中。确保extern crate语句在语句之前mod,否则模块将无法访问导入的宏。

然后,您可以在子模块中使用该宏。

  • @ durka42仍然会导致相同的错误。 (6认同)

She*_*ter 5

我想出了我原来的问题。原来有 2 个 Cargo 根?我有 alib.rs和 a main.rs。事实证明,将#[macro_use]was放在正确的位置lib.rs