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

时间:2018-01-07 16:33:10

标签: rust

我在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!宏的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

documentation for 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
    }
}
  

因为它试图评估两个表达式。

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

另见: