编译时自动检查cfg配置

编译时自动检查cfg配置

💡 原文英文,约700词,阅读约需3分钟。
📝

内容提要

Rust 1.80将自动检查#[cfg]是否与预期的配置名称和值匹配,以帮助验证crate是否正确处理不同目标平台或功能的条件编译。这有助于捕捉开发过程中的潜在错误。Cargo还提供了新的指令cargo::rustc-check-cfg,用于检查自定义cfg。该功能无法禁用,但可以通过控制lints来控制。

🔎

延伸解读

自动检查机制如何工作

从 Rust 1.80 开始,编译器会自动检查代码中所有可达的 #[cfg] 条件,确保其配置名称和值与预期一致。Cargo 会将声明的特性转换为配置传递给 rustc,并与已知配置对比。如果发现未预期的配置,会通过 unexpected_cfgs lint 报告警告。这有助于在开发早期发现条件编译错误,例如拼写错误或未声明的特性。

自定义 cfg 的处理方式

自定义 cfg 是指既不由 rustc 定义也不由 Cargo 特性定义的配置,例如 tokio_unstable。对于这类配置,Cargo 1.80 引入了 cargo::rustc-check-cfg 指令,需要在 build.rs 中声明以表明预期。每个 cargo::rustc-cfg 都应伴随一个无条件的 cargo::rustc-check-cfg,否则会触发警告。目前没有其他方法可以在没有 build.rs 的情况下预期自定义 cfg,因此鼓励使用 Cargo 特性替代。

lint 的控制与影响范围

unexpected_cfgs lint 无法禁用,但可以通过 lint 属性进行控制,例如 #![warn(unexpected_cfgs)]。该 lint 仅对本地包报告,不会影响依赖项,这得益于 cap-lints 机制。RUSTFLAGS 环境变量的使用方式不变,但 --cfg 参数本身不会被检查,只有代码中的使用会被检查。这意味着通过 RUSTFLAGS 传递的自定义 cfg 不会直接触发警告,除非在本地代码中使用。

❓

Q&A

Rust 1.80的新特性是什么?

Rust 1.80将自动检查#[cfg]是否与预期的配置名称和值匹配。

如何使用cargo::rustc-check-cfg指令?

使用cargo::rustc-check-cfg指令可以检查自定义cfg,确保它们符合预期。

这个新功能对开发者有什么帮助?

该功能帮助开发者验证crate是否正确处理条件编译,捕捉潜在错误。

如何控制unexpected_cfgs lint?

虽然该功能无法禁用,但可以通过控制lints来管理,例如使用#![warn(unexpected_cfgs)]。

自定义cfg的定义是什么?

自定义cfg是指既不由rustc定义也不由Cargo特性定义的配置。

RUSTFLAGS环境变量如何与新功能交互?

RUSTFLAGS环境变量的使用与之前相同,--cfg参数不会被检查。

🏷️

标签

➡️

继续阅读