使用“cfg!”宏在多个实现之间进行选择的正确方法是什么?



我在Cargo.toml中指定了一些功能:

[features]
complex = []
simple = []

当我构建我的项目时,我使用 cargo build --features="complex"simple .

在某些函数中,我想根据使用的功能返回一个值:

fn test() -> u32 {
    let x: u32 = 3;
    if cfg!(feature = "complex") {
        let y: u32 = 2;
        x + y
    }
    if cfg!(feature = "simple") {
        let y: u32 = 1;
        x + y
    }
}

但这不起作用,因为它试图评估这两个表达式。在我的情况下,使用 cfg! 宏的正确方法是什么?

cfg!的文档指出:

配置标志的布尔计算。

这意味着cfg!(...)被替换为布尔值(true/false (。展开后,您的代码将如下所示:

fn test() -> u32 {
    let x = 3;
    if true {
        let y = 2;
        x + y
    }
    if true {
        let y = 1;
        x + y
    }
}

最简单的解决方案是添加一个else

fn test() -> u32 {
    let x = 3;
    if cfg!(feature = "complex") {
        let y = 2;
        x + y
    } else {
        let y = 1;
        x + y
    }
}

您还可以使用 cfg 的属性形式。在这种情况下,该属性可以阻止编译整个下一个表达式:

fn test() -> u32 {
    let x: u32 = 3;
    #[cfg(feature = "complex")]
    {
        let y: u32 = 2;
        x + y
    }
    #[cfg(feature = "simple")]
    {
        let y: u32 = 1;
        x + y
    }
}

因为它试图计算这两个表达式。

不,它没有。计算在运行时进行,甚至无法编译此代码。

另请参阅:

  • 是否可以有条件地编译函数中的代码块?
  • 如何在 Rust 中使用条件编译宏的示例
  • Rust 条件编译属性覆盖了多少行?

最新更新