Макроси в одному ящику
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
bar!();
Якщо ви хочете використовувати макрос у тому самому ящику, модуль, який визначається вашим макросом, потребує атрибута #[macro_use]
.
Макроси можна використовувати лише після їх визначення. Це означає, що це не працює:
bar!();
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
Макроси в ящиках
Щоб використовувати ваш macro_rules!
макрос з інших ящиків, самому макросу потрібен атрибут #[macro_export]
. Ящик для імпорту може потім імпортувати макрос через use crate_name::macro_name;
.
Ящик util
#[macro_export]
macro_rules! foo {
() => ()
}
Ящик user
use util::foo;
foo!();
Зверніть увагу, що макроси завжди живуть на верхньому рівні ящика; так що навіть якщо foo
це буде всередині a mod bar {}
, user
ящик все одно повинен писати, use util::foo;
а ні use util::bar::foo;
.
До Rust 2018 вам потрібно було імпортувати макрос з інших ящиків, додавши атрибут #[macro_use]
до extern crate util;
оператора. Це імпортувало б усі макроси з util
. Як варіант, #[macro_use(cat, dog)]
може використовуватися лише для імпорту макросів cat
та dog
. Цей синтаксис більше не повинен бути необхідним.
Детальніша інформація доступна у розділі Мова програмування іржі про макроси .
module::my_macro!()?