如何针对指定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
相关产品推荐
相关产品推荐

