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规则代码>生成其他宏。那就是,谢谢!