You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中使用Feature Flag包裹多行代码且不引入新作用域

Rust Feature Flag 避免新作用域的正确用法

你的理解完全正确:#[cfg(not(feature = "my-feature"))]后手动添加大括号会创建新的作用域,导致后续代码无法访问该作用域内定义的temp变量,这就是你遇到编译错误的原因。

错误代码回顾

fn main() {
    #[cfg(not(feature = "my-feature"))] {
        let temp: usize = 1;
    }
    
    let mut output = 0;
    
    #[cfg(not(feature = "my-feature"))]
    output = temp + 1;
    
    println!("output: {:?}", output);
}

两种正确实现方式

方式一:直接为语句添加#[cfg]属性(无额外作用域)

去掉手动添加的大括号,让#[cfg]直接作用于变量声明语句,这样temp会和后续代码处于同一个作用域:

fn main() {
    #[cfg(not(feature = "my-feature"))]
    let temp: usize = 1;
    
    let mut output = 0;
    
    #[cfg(not(feature = "my-feature"))]
    output = temp + 1;
    
    println!("output: {:?}", output);
}

当my-feature未启用时,temp会被正常声明,后续的赋值语句也能访问到它;当my-feature启用时,这两行带#[cfg]的代码会被编译期直接移除,不会产生任何额外开销。

方式二:使用cfg!宏统一管理条件逻辑

如果需要把相关的条件代码放在一起,可以用cfg!宏(编译时求值的布尔宏),配合if语句实现:

fn main() {
    let mut output = 0;
    // 提前声明变量,确保作用域覆盖后续代码
    let temp: usize;

    if cfg!(not(feature = "my-feature")) {
        temp = 1;
        output = temp + 1;
    } else {
        // 必须为temp赋值,因为Rust要求变量初始化后才能使用
        temp = 0;
        // 可选:feature启用时的output逻辑
        output = 0;
    }
    
    println!("output: {:?}", output);
}

cfg!宏会在编译时计算布尔值,编译器会自动优化掉不可达的分支,最终生成的代码和直接用#[cfg]属性的效果一致,好处是可以把相关的条件逻辑集中管理,代码可读性更强。

内容的提问来源于stack exchange,提问作者terett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:20:55