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

当多个#[cfg(...)]均不匹配时,如何配置常量的回退值?

解决方法

直接使用你最初尝试的条件编译属性方案即可,只需要补全ELSE分支的条件判断:

#[cfg(target_os = "linux")]
const MAP_FLAGS: libc::c_int = libc::MAP_POPULATE;

#[cfg(target_os = "macos")]
const MAP_FLAGS: libc::c_int = libc::MAP_NOCACHE;

#[cfg(not(any(target_os = "linux", target_os = "macos")))]
const MAP_FLAGS: libc::c_int = 0;

为什么cfg!宏不行?

cfg!宏只是在编译时计算一个布尔值,但它不会移除未满足条件的代码分支。比如你如果写:

const MAP_FLAGS: libc::c_int = if cfg!(target_os = "linux") {
    libc::MAP_POPULATE
} else if cfg!(target_os = "macos") {
    libc::MAP_NOCACHE
} else {
    0
};

这段代码在Linux平台编译时,libc::MAP_NOCACHE的引用依然会被编译器检查,但该常量在Linux的libc中不存在,因此会报错。而#[cfg]属性会直接将不符合条件的代码块从编译流程中排除,不会对这些代码进行语法和符号检查,完美适配不同平台的常量存在性差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:15:38