首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cargo自动激活功能

Cargo自动激活功能
EN

Stack Overflow用户
提问于 2021-08-14 15:03:07
回答 1查看 137关注 0票数 0

我有一个依赖于库的二进制文件。在库中,我指定了以下功能:

代码语言:javascript
复制
[features]
default = []
fet = []

我期望特性fet只有在使用特性标志进行编译时才会被激活。在我的二进制文件中,Cargo.toml如下所示:

代码语言:javascript
复制
[dependencies]
a = { path = "./a" }

[features]
default = []

我没有在Cargo.toml中指定fet特性,但是这会在我的二进制文件中产生一个编译错误:

代码语言:javascript
复制
fn main() {
    if cfg!(feature = "fet") {
        compile_error!("not expected");
    }
}

为什么在我的二进制文件中功能fet仍然处于激活状态?我执行了这些命令,得到了相同的错误:

代码语言:javascript
复制
cargo run
cargo run --features=default

理想情况下,如果在cargo run命令(在--features标志中)中明确提到了依赖项中的某些特性,我希望我的二进制文件能够激活这些特性。这可能吗?我希望这能在我的二进制Cargo.toml中工作

代码语言:javascript
复制
[features]
default = []
fet = ["a/fet"]

如果我运行以下命令,功能fet将被激活:

代码语言:javascript
复制
cargo run --features=fet
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-14 15:17:13

根据条件是true还是false,cfg!宏将扩展为truefalse,因此如果未设置feature标志,它仍将扩展为:

代码语言:javascript
复制
fn main() {
    if false {
        compile_error!("not expected");
    }
}

compile_error!宏仍将被调用,因此无论哪种方式,您都会得到编译器错误。

当您可以依靠编译器优化掉永远不会被采用的分支时,cfg!宏最有用,比如if false分支。然而,代码在优化之前仍然需要编译,所以当代码只有在条件为true或false时才编译时,它的用处就不大了。

您需要使用的是#[cfg]属性或cfg_if::cfg_if!宏:

代码语言:javascript
复制
// with #[cfg] attribute

fn main() {
    #[cfg(feature = "fet")]
    compile_error!("not expected");
}

// with cfg_if!
use cfg_if::cfg_if;

fn main() {
    cfg_if!{
        if #[cfg(feature = "fet")] {
            compile_error!("not expected");
        }
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68784482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档