我有宏调用另一个宏。这是文件的简化版本(实际的外部宏有匹配的逻辑)。
macro_rules! outer_macro {
() => (
inner_macro!()
)
}
macro_rules! inner_macro{
() => (
// stuff
)
}
当我把这些宏放在调用outer_macro
的同一个文件(src/caller.rs
)中时,一切都正常,但我把它们移到了它们自己的文件src/macros.rs
中,现在src/caller.rs
找不到outer_macro
了。
我试着在outer_macro
和pub mod macros;
上添加#[macro_export]
到src/lib.rs
,现在src/caller.rs
可以找到outer_macro
,但是outer_macro
找不到inner_macro
。
#[macro_export]
macro_rules! outer_macro {
() => (
inner_macro!()
^^^^^^^^^^^
)
}
macro_rules! inner_macro{
() => (
// stuff
)
}
如何使outer_macro
可用于机箱的其余部分,同时将inner_macro
保持在其范围内?
1条答案
按热度按时间hgqdbh6s1#
这里的问题是宏实际上没有引用
inner_macro
;相反,它只是简单地将字符串inner_macro!()
复制粘贴到使用宏的任何地方,因此,inner_macro
在任何地方都必须是有效路径;换句话说,使用outer_macro
内部的绝对路径:“如何使
outer_macro
可用于机箱的其余部分,同时将inner_macro
保持在其范围内?”你不能,这就是宏的意义:它们实际上用新代码替换了宏调用,这意味着插入的新代码必须对调用位置也有效,也就是说,如果你在
outer_macro
中使用inner_macro
调用,那么在使用outer_macro
的任何地方都必须可见。另一种选择是使用internal rules,正如@Jmb指出的那样:
这实际上会隐藏内部宏。