您的位置:首页 > 其它

Rust进阶之条件编译

2015-05-14 09:21 399 查看
Rust有一个特殊的属性,#[cfg],允许你一句传递给编译器的标志来编译代码。它有两种形式:

#[cfg(foo)]

#[cfg(bar = "baz")]


它们还有一些辅助形式:

#[cfg(any(unix, windows))]

#[cfg(all(unix, target_pointer_width = "32"))]

#[cfg(not(foo))]


可以随意嵌套:

#[cfg(any(not(unix), all(target_os="macos", target_arch = "powerpc")))]


如果你正在使用Cargo,怎样打开或关闭这些开关,它们在Cargo.toml文件中的[features]节进行设置。

[features]
# no features by default
default = []

# The “secure-password” feature depends on the bcrypt package.
secure-password = ["bcrypt"]


当你这么做了,Cargo会给rustc传递一个参数:

--cfg feature="${feature_name}"


这些cfg标志将会决定哪个一个被激活,因此,哪个代码被编译。我们看一下这段代码:

#[cfg(feature = "foo")]
mod foo {
}


如果我们使用cargo build --features "foo"编译,它将会把--cfg feature="foo"标志传递给rustc,并且输出将会有一个foo模块。如果我们使用常规的cargo build,没有额外的标志被传递,将不会有foo模块存在。

cfg_attr

你可以使用cfg_attr给基于cfg的变量设置另外一个属性:

#[cfg_attr(a, b)]


如果a被使用cfg设置过属性,则跟#一样。

[b]cfg!

cfg!语法扩展允许你在代码中使用这些种类的标志:

if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
println!("Think Different!");
}


在编译阶段依据配置设定,这些将会被替换成true或false。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息