首页 > 解决方案 > 检查宏中定义的项目中的功能标志

问题描述

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

trait TestTrait {}

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

正如这个箱子的单元测试中所写的那样,这工作得很好。但是,当我在我的应用程序中实际使用 crate 作为依赖项时,启用了功能标志,不会添加特征;我相信是因为在[cfg(feature="my-feature")]我的应用程序的上下文中进行了评估,它没有这样的功能标志。查看宏扩展代码,该impl TestTrait ...项目不存在,即使宏的其他部分(与此最小示例无关)存在。

有没有办法使这项工作?例如,是否有某种 [cfg(feature="my-crate::my-feature")]语法?如果不是,我应该如何在宏上下文中基于创建范围的功能标志启用条件编译?

标签: rustmacrosconditional-compilation

解决方案


我相信是因为在[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) => {}
}

推荐阅读