#[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!