Watch 25 Star 65 Fork 17

hainuo / rust ebookRuby

Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Without author's permission, this code is only for learning and cannot be used for other purposes.
Clone or download 3.20 KB
Copy Edit Web IDE Raw Blame History
hainuo authored 2015-07-08 22:38 . 语法变量引用

% 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:


# 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() {}

# 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 配置块中。

# 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:


--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(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(a, b)]
# fn foo() {}

Will be the same as #[b] if a is set by cfg attribute, and nothing otherwise.



The cfg! syntax extension lets you use these kinds of flags elsewhere in your code, too:


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.


Comment ( 0 )

Sign in for post a comment