條件編譯

2018-08-12 22:03 更新

條件編譯

Rust 有一個(gè)特殊屬性 #[cfg],它允許你編譯基于標(biāo)志的代碼并傳遞給編譯器。它有兩種形式:

    #[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")))]

至于如何啟用或禁用這些開(kāi)關(guān),如果你使用 Cargo,可以在 Cargo.toml 的 [features] 部分 加以設(shè)置:

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

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

當(dāng)你這樣做時(shí),Cargo 傳遞一個(gè)標(biāo)識(shí)給 rustc:

    --cfg feature="${feature_name}"

這些 cfg 標(biāo)識(shí)的總和將決定哪些得到激活,從而致使哪些代碼被編譯。讓我們看看這段代碼:

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

如果我們使用 cargo build --features "foo" 編譯代碼,它將發(fā)送 --cfg feature="foo" 標(biāo)識(shí)給 rustc,且輸出中包含 mod foo。如果我們定期地使用 cargo build 編譯它,也不傳遞額外的標(biāo)識(shí),就不會(huì)存在任何 foo 模塊。

cfg_attr

你也可以使用 cfg_attr 設(shè)置另一個(gè)基于 cfg 變量的屬性:

    #[cfg_attr(a, b)]

如果 a 使用 cfg 屬性設(shè)定,和使用 #[b] 是相同的。

cfg!

cfg! 語(yǔ)法擴(kuò)展允許你在你代碼中的任何位置使用這些類(lèi)型標(biāo)記:

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

根據(jù)配置設(shè)置不同,這些在編譯時(shí)取真或假。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)