在c语言中,条件编译是一个非常好用的功能,那么rust中如何实现条件编译呢?
rust的条件编译需要两个部分,一个是fratures
,另一个是cfg
。Cargo feature
是一个非常强大的功能,可以提供条件编译和可选依赖项的高级特性,这里只用条件编译功能
1 条件编译
在C语言中,条件编译需要先使用#defien XXX
定义变量,然后再使用#ifdef XXX, #endif
判断编译条件。那么在rust语言中如何实现呢?
1.1 定义变量
这一步相当于C语言中的变量的定义,即#defien XXX
功能。
在cargo.toml
文件中使用feature
,使用方式如下:
rust">[features]
dbug = []
udug = []
上述代码相当于是有了两个编译条件
1.2 条件编译
在C语言中,条件编译的实现是#ifdef
,在rust中则是使用#[cfg()]
或者cfg!
宏实现,代码如下:
rust">#[cfg(feature = "dbus")]
{println!("dbus");printf_dbus();
}// 或者
if cfg!(feature = "dbus") {println!("dbus");printf_dbus();
}
1.3 整个文件都需要使用条件编译
当整个文件都需要使用条件编译的时候,可以直接在文件的最开始使用#[cfg()]
。假设dbus.rs
整体都需要条件编译,示例如下:
rust">#[cfg(feature = "dbus")]
pub mod debus {struct xxxx{}pub fn dbus_xxxx() {}
}
使用该文件中的函数
rust">mod dbus;
use crate::dbus::debus::*;fn main()
{#[cfg(feature = "dbus")]{dbus_xxxx();}
}
1.4 编译代码
使用条件编译,在编译代码的时候需要使用下面命令,就可以将dbus代码编译进去。
cargo build --features "dbus"
默认编译
在编译代码不使用 --reatures
选项的时候,代码会编译一个叫做default
的默认字段,当没有任何默认需要编译的条件时,该字段可以省略,如下所示:
rust">[features]
dbug = []
udug = []
如果在默认编译个时候需要编译dbug
部分代码,则default
部分可以写成如下方式:
rust">[features]
default = ["dbug",]
dbug = []
udug = []
2 代码
代码下载:rust条件编译
目录结构
cargo.toml
rust">[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
rust">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
rust">#[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);
}
}