This action will force synchronization from hainuo/rust ebook, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
% Conditional Compilation 条件编译
Rust has a special attribute, #[cfg]
, which allows you to compile codebased on a flag passed to the compiler. It has two forms:
Rust语言有一个特殊的属性——#[cfg]
——它允许你基于一个标记参数来编译代码。它有两种形式:
#[cfg(foo)]
# fn foo() {}
#[cfg(bar = "baz")]
# fn bar() {}
They also have some helpers:
他们有一些辅助项
#[cfg(any(unix, windows))]
# fn foo() {}
#[cfg(all(unix, target_pointer_width = "32"))]
# fn bar() {}
#[cfg(not(foo))]
# fn not_foo() {}
These can nest arbitrarily:
他们可以任意嵌套:
#[cfg(any(not(unix), all(target_os="macos", target_arch = "powerpc")))]
# fn foo() {}
As for how to enable or disable these switches, if you’re using Cargo,they get set in the [features]
section of your Cargo.toml
:
那么当你使用Cargo的时候,如何开启和禁用这些开关呢?他们被设定在你的Cargo.toml
文件的[features]
section 配置块中。
[features]
# no features by default
default = []
# The “secure-password” feature depends on the bcrypt package.
secure-password = ["bcrypt"]
When you do this, Cargo passes along a flag to rustc
:
当你做这么做时,Cargo传递给rustc
一个标记:
--cfg feature="${feature_name}"
The sum of these cfg
flags will determine which ones get activated, and therefore, which code gets compiled. Let’s take this code:
这些cfg
标记汇总起来将决定哪些代码能够被激活,因此那部分代码得以被编译。让我们看下面的代码:
#[cfg(feature = "foo")]
mod foo {
}
If we compile it with cargo build --features "foo"
, it will send the --cfg feature="foo"
flag to rustc
, and the output will have the mod foo
in it.If we compile it with a regular cargo build
, no extra flags get passed on,and so, no foo
module will exist.
如果我们使用cargo build --features "foo"
来编译它,它将会给tustc
添加一个--cfg feature="foo"
的标记,并且在输出信息中有mod foo
。如果我们使用普通的cargo build
来编译它,那么就没有给rustc
添加任何标记,因此也就没有foo
存在。
You can also set another attribute based on a cfg
variable with cfg_attr
:
你同样可以使用cfg_attr
给cfg
变量设置额外的属性值。
#[cfg_attr(a, b)]
# fn foo() {}
Will be the same as #[b]
if a
is set by cfg
attribute, and nothing otherwise.
如果a
被cfg
属性设置,#[b]
也将同样被设计,否则反之。
The cfg!
syntax extension lets you use these kinds of flags elsewhere in your code, too:
cfg!
语法扩展也能让你在代码中其他地方使用这种标记:
if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
println!("Think Different!");
}
These will be replaced by a true
or false
at compile-time, depending on the configuration settings.
根据不同的配置设置,在编译时,这些标记被true
或者false
替代。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。