如何在Rust中导入宏?

Adi*_*omo 5 macros rust glium

我正在努力解决如何从外部箱子导入宏的问题.在我的主要人员中,我正在进口Glium箱子:

#![macro_use]
extern crate glium;

pub use glium::*;

// where my actual main function will be done from
mod part01drawtriangle;

fn main() {
    part01drawtriangle::main();
}
Run Code Online (Sandbox Code Playgroud)

在我的主要功能来自我的另一个文件中,我从该包中调用了一个宏:

pub fn main() {
    implement_vertex!(Vertex, position);
}
Run Code Online (Sandbox Code Playgroud)

构建时,我收到错误消息:

error: macro undefined: 'implement_vertex!'
Run Code Online (Sandbox Code Playgroud)

DK.*_*DK. 15

#[macro_use]不是#![macro_use].

#[..]将属性应用于之后的东西(在本例中为extern crate). #![..]将属性应用于包含的东西(在本例中为根模块).

  • 您可能想要打开箱子的问题; 解决方案是在宏定义中使用`$ crate ::`而不是`glium ::`. (2认同)

Nic*_*lay 5

根据Rust 版指南

在 Rust 2018 中,您可以通过语句从外部 crate导入特定的宏use,而不是旧#[macro_use]属性。

// in a `bar` crate's lib.rs:
#[macro_export]
macro_rules! baz {
    () => ()
}

// in your crate:
use bar::baz;

// Rather than:
//
// #[macro_use]
// extern crate bar;
Run Code Online (Sandbox Code Playgroud)

这仅适用于在外部 crate 中定义的宏。对于本地定义的宏,#[macro_use] mod foo;仍然需要,就像在 Rust 2015 中一样。

  • 截至 2022 年 3 月,macro_export 导出到根目录,并且该宏可以与“use crate::baz”一起使用。 (4认同)