Makra w tej samej skrzynce
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
bar!();
Jeśli chcesz użyć makra w tej samej skrzynce, moduł, w którym zdefiniowane jest makro, potrzebuje atrybutu #[macro_use]
.
Makra można używać tylko po ich zdefiniowaniu. Oznacza to, że to nie działa:
bar!();
#[macro_use]
mod foo {
macro_rules! bar {
() => ()
}
}
Makra w skrzyniach
Aby użyć macro_rules!
makra z innych skrzynek, samo makro potrzebuje atrybutu #[macro_export]
. Skrzynka importująca może następnie zaimportować makro przez use crate_name::macro_name;
.
Skrzynia util
#[macro_export]
macro_rules! foo {
() => ()
}
Skrzynia user
use util::foo;
foo!();
Zwróć uwagę, że makra zawsze znajdują się na najwyższym poziomie skrzynki; więc nawet gdyby foo
był wewnątrz a mod bar {}
, user
skrzynia nadal musiałaby pisać, use util::foo;
a nie use util::bar::foo;
.
Przed Rust 2018 trzeba było importować makro z innych skrzynek, dodając atrybut #[macro_use]
do extern crate util;
instrukcji. Spowoduje to zaimportowanie wszystkich makr z util
. Alternatywnie #[macro_use(cat, dog)]
można użyć tylko do importowania makr cat
i dog
. Ta składnia nie powinna być już potrzebna.
Więcej informacji można znaleźć w rozdziale poświęconym makrom w języku programowania Rust .
module::my_macro!()?