gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:25:09 26 4
gpt4 key购买 nike

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

最佳答案

documentation for cfg!状态:

Boolean evaluation of configuration flags.

这意味着 cfg!(...) 被替换为 bool 值 (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
}
}

as it tries to evaluate both expressions.

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

另见:

关于rust - 使用 `cfg!` 宏在多个实现之间进行选择的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48139243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com