Макросы в одном ящике
#[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
бы был внутри mod bar {}
, user
ящик все равно пришлось бы писать, use util::foo;
а не use util::bar::foo;
.
До Rust 2018 вам приходилось импортировать макрос из других ящиков, добавляя атрибут #[macro_use]
в extern crate util;
оператор. Это импортирует все макросы из util
. В качестве альтернативы #[macro_use(cat, dog)]
можно использовать только для импорта макросов cat
и dog
. В этом синтаксисе больше нет необходимости.
Дополнительная информация доступна в главе о макросах языка программирования Rust .
module::my_macro!()?