我有一个依赖于库的二进制文件。在库中,我指定了以下功能:
[features]
default = []
fet = []我期望特性fet只有在使用特性标志进行编译时才会被激活。在我的二进制文件中,Cargo.toml如下所示:
[dependencies]
a = { path = "./a" }
[features]
default = []我没有在Cargo.toml中指定fet特性,但是这会在我的二进制文件中产生一个编译错误:
fn main() {
if cfg!(feature = "fet") {
compile_error!("not expected");
}
}为什么在我的二进制文件中功能fet仍然处于激活状态?我执行了这些命令,得到了相同的错误:
cargo run
cargo run --features=default理想情况下,如果在cargo run命令(在--features标志中)中明确提到了依赖项中的某些特性,我希望我的二进制文件能够激活这些特性。这可能吗?我希望这能在我的二进制Cargo.toml中工作
[features]
default = []
fet = ["a/fet"]如果我运行以下命令,功能fet将被激活:
cargo run --features=fet发布于 2021-08-14 15:17:13
根据条件是true还是false,cfg!宏将扩展为true或false,因此如果未设置feature标志,它仍将扩展为:
fn main() {
if false {
compile_error!("not expected");
}
}compile_error!宏仍将被调用,因此无论哪种方式,您都会得到编译器错误。
当您可以依靠编译器优化掉永远不会被采用的分支时,cfg!宏最有用,比如if false分支。然而,代码在优化之前仍然需要编译,所以当代码只有在条件为true或false时才编译时,它的用处就不大了。
您需要使用的是#[cfg]属性或cfg_if::cfg_if!宏:
// 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");
}
}
}https://stackoverflow.com/questions/68784482
复制相似问题