我在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 条件编译属性覆盖了多少行?