Макросы в одном ящике
#[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!()?