当多个#[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
相关产品推荐
相关产品推荐

