我正在尝试使用Rust的功能在我的crate中有条件地编译一个模块,并且仅在启用某个特性时使用它。当设置了特性时,有条件的编译工作正常,但在未设置特性时拒绝编译。
我在主要代码中使用相同的特性标志来有条件地导入模块,因此我的假设是在不使用该特性时不应该导入该模块。
如果我使用
这是我的
有人能解释一下为什么会发生这种情况并提供更好的条件编译代码块的方法吗?
我在主要代码中使用相同的特性标志来有条件地导入模块,因此我的假设是在不使用该特性时不应该导入该模块。
#[cfg(feature = "debug")]
pub mod k {
pub struct S { pub x: i32, pub y: i32}
}
我如何在主要程序中使用它
pub fn main() {
if cfg!(feature = "debug") {
use self::k;
let _s = k::S {x: 4, y: 5};
}
let g = vec![1, 2, 4];
println!("{:?}", g);
}
如果我使用
--features
标志启用该功能,那么它将按预期编译:cargo build --features "debug"
Finished dev [unoptimized + debuginfo] target(s) in 0.08s
但是当我没有传递--features
时,它会失败,我的期望是它应该跳过具有cfg!
设置的代码块。
error[E0432]: unresolved import `self::k`
--> src/main.rs:32:13
|
32 | use self::k;
| ^^^^^^^ no `k` in the root
error: aborting due to previous error
For more information about this error, try `rustc --explain E0432`.
这是我的
Cargo.toml
文件的样子。[features]
default = []
debug = []
有人能解释一下为什么会发生这种情况并提供更好的条件编译代码块的方法吗?
debug
,则在编译期间if cfg!(feature = "debug") {
将被替换为类似于if false
的内容,但是接下来的两行仍将被编译。但是,只有在启用feature = debug
时才会编译mod k
,因此编译器会抱怨缺少模块。我可以用#[cfg(feature = "debug")]
替换if else
,然后跟随一个块,在其中创建我需要的结构体。 - draklor40