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

tin*_*ker 1 rust

我在里面指定了一些功能Cargo.toml

[features]
complex = []
simple = []
Run Code Online (Sandbox Code Playgroud)

当我构建项目时,我使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

She*_*ter 8

状态的cfg!文档:

配置标志的布尔评估。

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

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

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

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

您还可以使用 的属性形式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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

不,事实并非如此。评估发生在运行时,并且该代码甚至无法编译。

也可以看看:


归档时间:

查看次数:

6228 次

最近记录:

6 年,1 月 前