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

dba5bblo  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(234)

我正在尝试基于target_os设置常量的值。我希望实现如下内容:

#[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(/* ELSE */)]
const MAP_FLAGS: libc::c_int = 0;

现在,自然的想法是使用cfg!宏,但这不会编译,因为libc::MAP_POPULATE只存在于linux目标上,而libc::MAP_NOCACHE只存在于macos目标上。
你知道怎么解决吗?

bzzcjhmw

bzzcjhmw1#

听起来你可能想尝试使用cfg-if crate,它提供了一个宏(cfg_if),允许在if-else结构中进行条件编译。

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

也就是说,这只是#[cfg(target_os = "linux")]#[cfg(all(target_os = "macos", not(target_os = "linux")))]#[cfg(all(not(target_os = "macos"), not(target_os = "linux")))]的语法糖。

bvjveswy

bvjveswy2#

我认为你已经很接近了,如果你只想为非linux或macos的任何东西设置默认值,你可以把not()any()结合起来:

#[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 = "macos", target_os = "linux")))]
const MAP_FLAGS: libc::c_int = 0;

相关问题