13

我正在努力解决如何从外部 crate 导入宏。在我的 main.rs 中,我正在导入 Glium 板条箱:

#![macro_use]
extern crate glium;

pub use glium::*;

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

fn main() {
    part01drawtriangle::main();
}

在我的主要功能来自的另一个文件中,我从该板条箱中调用其中一个宏:

pub fn main() {
    implement_vertex!(Vertex, position);
}

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

error: macro undefined: 'implement_vertex!'
4

2 回答 2

19

#[macro_use],不是#![macro_use]

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

于 2016-07-27T12:37:20.200 回答
7

根据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;

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

于 2020-06-08T17:11:50.547 回答