Rust-条件编译

#[cfg]

#[cfg]允许我们基于一个传递给编译器的标记编译代码。它有两种形式:

#[cfg(foo)]
fn foo(){
}

#[cfg(bar="baz")]
fn bar(){
}

它还有一些帮助选项:

#[cfg(any(unix,target_pointer_width = "32"))]
pub fn foo(){
}

#[cfg(all(unix,windows))]
pub fn bar(){
}

#[cfg(not(foo))]
pub fn not_foo(){
}

 这些选项可以任意嵌套:

#[cfg(not(foo),all(target_os = "macos",target_arch = "powerpc"))]
pub fn not_foo(){
}

 如何启用和禁用这些开关,如果我们使用Cargo,可以在Cargo.toml中的[features]部分设置:

[features]
foo=[]

当我们这样设置时,Cargo传递给rustc一个标记:

--cfg feature="${feature_name}"

这些cfg标记集合会决定哪些功能被启用,并且因此,哪些代码会被编译。如下:

如果使用

cargo build --features="foo"

编译,他会向rustc传递--cfg feature="foo"标记,并且输出中将会包含 mod foo。如果我们使用常规的cargo build编译,则不会传递额外的标记,因为输出不会存在foo模块。

 

#[cfg_attr]

 

cfg!

posted @ 2022-01-30 15:50  johnny_zhao  阅读(364)  评论(0编辑  收藏  举报