Как использовать макрос, который определяется другим макросом в том же ящике? - PullRequest
0 голосов
/ 29 декабря 2018

Я определяю макрос, который определяет другие макросы следующим образом:

macros.rs

#[macro_export]
macro_rules! m1 {
    () => {
        #[macro_export]
        macro_rules! m2 {
            () => {}
        }
    }
}

m1!();
m2!(); // no problem;

Я могу использовать m2! в другом ящике с помощьюuse {{crate_name}}::macros::*, и я могу использовать m2! в macros.rs, но я не знаю, как использовать m2! в файлах, находящихся в одном ящике.

lib.rs

#[macro_use]
pub mod macros;
pub mod test;
pub mod test2;

test.rs (в том же ящике, что и macros.rs)

use crate::m1; // no problem
use crate::m2; // ERROR: macro-expanded `macro_export` macros from the current crate cannot be referred to by absolute paths

m1!(); // no problem
m2!(); // error, no m2

test2.rs

use crate::*;
m2!(); // this works, but I don't really want to use crate::*

examples / yo.rs

use {{crate_name}}::m2;
m2!(); // no problem

Как правильно использовать этот макрос m2 в других файлах в том же ящике?Я использую Rust 1.31.1.

1 Ответ

0 голосов
/ 30 декабря 2018

Прочитайте и следуйте инструкциям компилятора:

error[E0659]: `m2` is ambiguous (macro-expanded name vs less macro-expanded name from outer scope during import/macro resolution)
  --> src/lib.rs:22:5
   |
22 |     m2!();
   |     ^^ ambiguous name
   |
note: `m2` could refer to the macro defined here
  --> src/lib.rs:7:13
   |
7  | /             macro_rules! m2 {
8  | |                 () => {};
9  | |             }
   | |_____________^
...
21 |       m1!();
   |       ------ in this macro invocation
note: `m2` could also refer to the macro defined here
  --> src/lib.rs:7:13
   |
7  | /             macro_rules! m2 {
8  | |                 () => {};
9  | |             }
   | |_____________^
...
13 |       m1!();
   |       ------ in this macro invocation

error: a macro named `m2` has already been exported
  --> src/lib.rs:7:13
   |
7  | /             macro_rules! m2 {
8  | |                 () => {};
9  | |             }
   | |_____________^ `m2` already exported
...
21 |       m1!();
   |       ------ in this macro invocation
   |
   = note: #[deny(duplicate_macro_exports)] on by default
   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in the 2018 edition!
   = note: for more information, see issue #35896 <https://github.com/rust-lang/rust/issues/35896>
note: previous macro export is now shadowed
  --> src/lib.rs:7:13
   |
7  | /             macro_rules! m2 {
8  | |                 () => {};
9  | |             }
   | |_____________^
...
13 |       m1!();
   |       ------ in this macro invocation

error: macro-expanded `macro_export` macros from the current crate cannot be referred to by absolute paths
  --> src/lib.rs:19:9
   |
19 |     use crate::m2; 
   |         ^^^^^^^^^
   |
   = note: #[deny(macro_expanded_macro_exports_accessed_by_absolute_paths)] on by default
   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
   = note: for more information, see issue #52234 <https://github.com/rust-lang/rust/issues/52234>
note: the macro is defined here
  --> src/lib.rs:7:13
   |
7  | /             macro_rules! m2 {
8  | |                 () => {};
9  | |             }
   | |_____________^
...
21 |       m1!();
   |       ------ in this macro invocation

В частности:

ошибка: макроразвернутые macro_export макросы из текущего ящика не могут ссылаться по абсолютным путям

Применено:

  1. Не импортировать макрос;в этом нет необходимости.
  2. Не звоните m1;при этом создается второй m2.

test.rs

// use crate::m1;
// use crate::m2; 

// m1!();
m2!();
...