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

如何针对指定Feature展开Rust条件编译指令生成源码?

问题

给定如下Rust代码:

#[cfg(feature="foo")]
fn bar(){...}

#[cfg(not(feature="foo"))]
fn bar(){...}

能否生成移除cfg属性、仅保留指定Feature对应实现的新Rust文件?也就是通过源到源转换,评估并展开特定Feature或其他条件编译规则?

目前已知rustc -Zunpretty=expanded test.rs或cargo expand等方案,但它们似乎只能全量展开,希望仅针对特定Feature执行该操作。

解决方案

当然可以针对特定Feature展开条件编译代码,关键是给编译工具指定要启用的Feature参数就行:

1. 用cargo expand指定Feature

cargo expand支持通过--features参数指定要启用的Feature,要是项目有默认Feature需要排除,再加个--no-default-features就行,这样就能只保留目标Feature对应的代码实现:

# 仅启用foo feature展开代码
cargo expand --features foo
# 排除默认Feature,仅启用foo
cargo expand --no-default-features --features foo

执行后输出的代码会自动去掉cfg属性,只留下符合指定Feature条件的bar函数。

2. 直接用rustc指定Feature

如果不用Cargo,直接用rustc的话,可以通过--cfg参数手动注入Feature条件,再配合-Zunpretty=expanded展开:

rustc --cfg feature=\"foo\" -Zunpretty=expanded test.rs

这样输出的代码也只会保留#[cfg(feature="foo")]标记的bar函数,所有cfg属性都会被移除。

补充说明

要是代码里有复杂的条件编译逻辑(比如多个Feature的与/或组合),上述方法同样管用——只要通过--features或--cfg参数准确指定要启用的条件,工具就会自动评估并展开对应的代码分支,最终生成只包含符合条件实现的干净代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:12:03