Как использовать макросы из реэкспортированных ящиков - PullRequest
0 голосов
/ 26 апреля 2018

Ящики могут реэкспортировать ящики, от которых они зависят.В этом примере stm32f103xx-hal ящик делает следующее: pub extern crate stm32f103xx;.

В моем коде я зависел от stm32f103xx-hal.Теперь я хочу использовать макрос interrupt!(), который экспортируется в stm32f103xx ящик.Нужно ли добавлять stm32f103xx зависимость от ящика в мой Cargo.toml, или есть способ повторно использовать экспортированное определение stm32f103xx-hal?

Обратите внимание, что это проблема, отличная от простой "как использовать макрос из другого ящика ".Объявление #[macro_use(interrupt)] на stm32f103xx-hal приводит к ошибке cannot find macro 'interrupt!' in this scope.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Промежуточный ящик должен повторно экспортировать макросы, чтобы они были доступны:

mac / src / lib.rs

#[macro_export]
macro_rules! a_macro {
    () => (42);
}

inter / src / lib.rs

pub extern crate mac;
pub use mac::*; // Re-export the macros

ex / src / main.rs

#[macro_use]
extern crate inter;

fn main() {
    println!("Hello, {}", a_macro!());
}

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

0 голосов
/ 07 мая 2018

Это было изменено совсем недавно, чтобы использовать общую систему импорта.

Предполагая, что вы хотите использовать макрос interrupt! из ящика foo, новый способ сделать это выглядит следующим образом:

#![feature(use_extern_macros)];

pub use foo::interrupt;

Обратите внимание, что это еще не стабильно, так что это особенность use_extern_macros.

0 голосов
/ 26 апреля 2018

Я думаю, вам нужно добавить stm32f103xx к вашему Cargo.toml.Вот почему:

Например, в дизеле lib.rs

#[macro_use]
extern crate diesel_derives;
#[doc(hidden)]
pub use diesel_derives::*;

Они ставят #[macro_use] на внешнюю линию ящика, затем они используют все отdiesel_derives project.

В вашем случае lib.rs выглядит так:

pub extern crate stm32f103xx;

Таким образом, реэкспорт не определяет использование макросов.

Именно поэтому вам необходимо добавить stm32f103xx в ваш Cargo.toml, чтобы указать использование макросов в вашем lib.rs.

...