【问题标题】:How to import macros in Rust?如何在 Rust 中导入宏?
【发布时间】:2016-07-27 12:02:14
【问题描述】:

我正在努力解决如何从外部 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!'

【问题讨论】:

  • 我遇到了同样的问题,也遇到了 glium,但尝试应用下面的解决方案不起作用。我不断收到宏未定义的错误。我的目录结构是 [main.rs, lib.rs, tutorial: [mod.rs, draw_triangle.rs]] 其中的implement_vertex!正在draw_triangle.rs中使用

标签: macros rust glium


【解决方案1】:

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

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

【讨论】:

  • 但后来我得到了像这样的错误failed to resolve. Use of undeclared type or module glium::glutin::WindowBuilder` 与命名空间有关吗?我也加了use glium::*;,但还是不行
  • 听起来像一个脆弱的宏。尝试将use glium; 添加到part01drawtriangle.rs 的顶部。
  • 你可能想用箱子打开一个问题;解决方案是在宏定义中使用$crate:: 而不是glium::
【解决方案2】:

根据the Rust Edition Guide

在 Rust 2018 中,您可以通过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;

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

【讨论】:

  • 自 2022 年 3 月起,macro_export 导出到根目录,并且该宏可以与 'use crate::baz' 一起使用。
猜你喜欢
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多