gpt4 book ai didi

macros - 如何使用由同一个 crate 中的另一个宏定义的宏?

转载 作者:行者123 更新时间:2023-11-29 07:51:30 25 4
gpt4 key购买 nike

我正在定义一个像这样定义其他宏的宏:

ma​​cros.rs

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

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

我可以使用 m2!在另一个 crate 中 use {{crate_name}}::macros::* , 我可以使用 m2!macros.rs , 但我不知道如何使用 m2!在同一个 crate 中的文件中。

lib.rs

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

test.rs(与 macros.rs 在同一个 crate 中)

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 的正确使用方法是什么?同一个 crate 中其他文件中的宏?我正在使用 Rust 1.31.1。

最佳答案

阅读并遵循编译器的说明:

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

具体来说:

error: macro-expanded macro_export macros from the current crate cannot be referred to by absolute paths

应用:

  1. 不要导入宏;没有必要。
  2. 不要调用m1;这样做会创建第二个 m2

测试.rs

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

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

关于macros - 如何使用由同一个 crate 中的另一个宏定义的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53972194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com