Как импортировать макросы в подмодулях в Rust?

У меня есть следующая структура каталогов

  • /main.rs
  • /lib.rs
  • /tutorial/mod.rs
  • /tutorial/foo.rs

В foo.rs Мне нужно использовать макрос из библиотеки glium, implement_vertex!. Если я положил #[macro_use] extern crate glium; во главе foo.rs, я получаю a error: an `extern crate` loading macros must be at the crate root. Я также получаю error: macro undefined: 'implement_vertex!'

Существует также lib.rs, который является корнем ящика модулей учебника. Мне нужно было поставить #[macro_use]. Создает ли это 2 корня ящика, если у меня есть как main.rs, так и lib.rs?

Каков правильный способ импорта макросов в подмодуль?

Ответ 1

Макросы обрабатываются достаточно рано на этапе компиляции, что порядок имеет значение. Вы, как и я, вероятно, становились красивыми и привыкли к тому, что Руст отмахивался от необходимости заботиться о порядке вашего использования и заявлений о ящике.

Переместите инструкцию #[macro_use] extern crate glium; в начало файла lib.rs и/или main.rs по мере необходимости.

Ответ 2

Сделайте это так, как компилятор сказал вам:

an `extern crate` loading macros must be at the crate root

Поместите #[macro_use] extern crate glium; в корень ящика, который main.rs в вашем случае. Убедитесь, что оператор extern crate находится перед вашими операторами mod, иначе модули не смогут получить доступ к импортированным макросам.

Затем вы можете использовать макрос в своем подмодуле.

Ответ 3

Я разобрался в своей первоначальной проблеме. Выходит, есть 2 грузовых корня? У меня есть и lib.rs и main.rs Оказывается, правильное место для размещения #[macro_use] было в lib.rs