Rust 检查宏中定义的项目中的要素标志

Rust 检查宏中定义的项目中的要素标志,rust,macros,conditional-compilation,Rust,Macros,Conditional Compilation,目前我有一个看起来像这样的板条箱: trait TestTrait{} 宏规则!加上你的特点{ ($type:ident)=>{ #[cfg(feature=“my feature”)] $type{}的impl TestTrait } } 这在这个板条箱的单元测试中写得很好。但是,当我在应用程序中实际使用板条箱作为依赖项时,在启用了特性标志的情况下,不会添加特征;我相信这是因为[cfg(feature=“my feature”)]是在我的应用程序的上下文中评估的,它没有这样的功能标志。查看宏

目前我有一个看起来像这样的板条箱:

trait TestTrait{}
宏规则!加上你的特点{
($type:ident)=>{
#[cfg(feature=“my feature”)]
$type{}的impl TestTrait
}
}
这在这个板条箱的单元测试中写得很好。但是,当我在应用程序中实际使用板条箱作为依赖项时,在启用了特性标志的情况下,不会添加特征;我相信这是因为
[cfg(feature=“my feature”)]
是在我的应用程序的上下文中评估的,它没有这样的功能标志。查看宏扩展的代码,尽管宏的其他部分(与这个最小示例无关)在那里,但是
impl TestTrait…
项不在那里

有没有办法让这一切顺利进行?例如,是否存在某种
[cfg(feature=“my crate::my feature”)]
语法?如果没有,我应该如何在宏上下文中基于创建作用域特征标志启用条件编译

我相信这是因为
[cfg(feature=“my feature”)]
是在我的应用程序的上下文中评估的,它没有这样的功能标志

是的,这是完全正确的

您可以将功能标志放在宏本身上,只需多次定义它:

#[cfg(feature="my-feature")]
macro_rules! add_trait {
    ($type:ident) => {
        impl TestTrait for $type {}
    }
}

#[cfg(not(feature="my-feature"))]
macro_rules! add_trait {
    ($type:ident) => {}
}

定义整个宏两次有帮助吗?(一次用于
feature=“my feature”
一次用于相反的功能。)嗯。。。。这将是困难的,虽然可能,因为实际的宏是相当大的,但我可以用这个特定的部分制作一对子宏,并像这样调用它们。如果宏更复杂,可以使用
macro\u规则生成其他宏。那就是,谢谢!