大上海小程序開發(fā)搜索引擎優(yōu)化的主題
在c語言中,條件編譯是一個非常好用的功能,那么rust中如何實現(xiàn)條件編譯呢?
rust的條件編譯需要兩個部分,一個是fratures
,另一個是cfg
。Cargo feature
是一個非常強大的功能,可以提供條件編譯和可選依賴項的高級特性,這里只用條件編譯功能
1 條件編譯
在C語言中,條件編譯需要先使用#defien XXX
定義變量,然后再使用#ifdef XXX, #endif
判斷編譯條件。那么在rust語言中如何實現(xiàn)呢?
1.1 定義變量
這一步相當于C語言中的變量的定義,即#defien XXX
功能。
在cargo.toml
文件中使用feature
,使用方式如下:
[features]
dbug = []
udug = []
上述代碼相當于是有了兩個編譯條件
1.2 條件編譯
在C語言中,條件編譯的實現(xiàn)是#ifdef
,在rust中則是使用#[cfg()]
或者cfg!
宏實現(xiàn),代碼如下:
#[cfg(feature = "dbus")]
{println!("dbus");printf_dbus();
}// 或者
if cfg!(feature = "dbus") {println!("dbus");printf_dbus();
}
1.3 整個文件都需要使用條件編譯
當整個文件都需要使用條件編譯的時候,可以直接在文件的最開始使用#[cfg()]
。假設(shè)dbus.rs
整體都需要條件編譯,示例如下:
#[cfg(feature = "dbus")]
pub mod debus {struct xxxx{}pub fn dbus_xxxx() {}
}
使用該文件中的函數(shù)
mod dbus;
use crate::dbus::debus::*;fn main()
{#[cfg(feature = "dbus")]{dbus_xxxx();}
}
1.4 編譯代碼
使用條件編譯,在編譯代碼的時候需要使用下面命令,就可以將dbus代碼編譯進去。
cargo build --features "dbus"
默認編譯
在編譯代碼不使用 --reatures
選項的時候,代碼會編譯一個叫做default
的默認字段,當沒有任何默認需要編譯的條件時,該字段可以省略,如下所示:
[features]
dbug = []
udug = []
如果在默認編譯個時候需要編譯dbug
部分代碼,則default
部分可以寫成如下方式:
[features]
default = ["dbug",]
dbug = []
udug = []
2 代碼
代碼下載:rust條件編譯
目錄結(jié)構(gòu)
cargo.toml
[package]
name = "feature_learn"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies][features]
default = []
dbus = []
ubus = []
main.rs
mod dbus;
#[cfg(feature = "dbus")]
use crate::dbus::debus::*;
// use crate::dbus::debus as debus;fn main() {println!("Hello, world!");#[cfg(feature = "dbus")] {println!("dbus");printf_dbus();}#[cfg(feature = "ubus")] {println!("ubus");} println!("default");// if cfg!(feature = "dbus") {// println!("dbus");// printf_dbus();// } else if cfg!(feature = "dbus")// {// println!("ubus");// } else {// println!("default")// };
}
dbug.rs
#[cfg(feature = "dbus")]
pub mod debus {
struct Dbus {arg1:i32,arg2:i32,arg3:i32,
}pub fn printf_dbus()
{let dbus = Dbus {arg1:1,arg2:2,arg3:3,};println!("dbus: {} {} {}", dbus.arg1, dbus.arg2, dbus.arg3);
}
}