Rust:#[cfg(foo)]与#[cfg(feature="foo")]条件编译方法选型
Rust中
#[cfg(foo)]与#[cfg(feature="foo")]的正确使用场景 两者都能实现条件编译,没有绝对的“对错”,核心看你要解决的场景:
优先用#[cfg(feature="foo")]的情况
这是Cargo官方推荐的特性管理方式,专门用来定义crate的公开可选功能:
- 你可以在
Cargo.toml的[features]区块里清晰列出所有可选特性,还能设置特性依赖(比如foo = ["bar"],启用foo自动带上bar)。 - 用户只需要通过
cargo build -F foo就能启用,完全符合Rust生态的通用约定,其他开发者一看就知道这是crate对外提供的可选功能。 - 支持在依赖其他crate时,通过
Cargo.toml的dependencies字段指定要启用的特性,生态兼容性拉满。
适合用#[cfg(foo)]的情况
这是rustc提供的底层自定义编译标志,更适合项目内部的私有编译条件:
- 比如你需要加一个只在调试阶段用的日志开关、针对特定编译环境的私有补丁,这些不需要对外暴露给用户的场景。
- 通过
rustc --cfg foo或者.cargo/config.toml里配置rustflags = "--cfg foo"来启用,属于项目内部的自定义逻辑,不需要让用户感知。 - 注意:如果用它来做对外的可选功能,会让用户需要手动配置rustflags,体验远不如feature友好,也不符合生态规范。
总结
- 做crate公开可选功能?选
#[cfg(feature="foo")],这是标准玩法。 - 做项目内部私有编译开关?用
#[cfg(foo)]更灵活。
内容的提问来源于stack exchange,提问作者exlinx
相关产品推荐
相关产品推荐

