如何在Rust中实现条件编译

发布于:2024-06-24 ⋅ 阅读:(107) ⋅ 点赞:(0)

目前正在学习使用Rust作后端开发,学习过程经常需要写一些调试代码,使用过程发现没有像#if 0 . . . #endif这样的条件编译。于是查阅资料,找到了替代方案,别说还挺好用。

前言

简答说下思路,就是利用Featurescfg配置编译条件,在编译和运行程序时附带特定条件就行。

cargo run --features "特性"

直接上操作吧。

配置Cargo.toml文件

  • default表示默认特性,可以理解为不带特性的编译,即执行cargo run
  • array_opt 是自定义特性,可定义多个,在features域中往后加就行;
[features]
default = []
array_opt = []

代码中添加条件编译

模板是这样的:

#[cfg(feature = "特性")]
{
	// 代码部分
}

下面是一段测试代码:

use std::collections::HashMap;

fn main() {

	/* ======================= 数组中位数和最大出现次数 ======================= */
	#[cfg(feature = "array_opt")]
	{
		let mut arr = vec![1, 3, 4, 5, 3, 6, 8, 4, 3];
		arr.sort();
	
		let len: usize = arr.len();
		println!("{arr:?}");
		println!("mid-val is {}", &arr[len/2]);
	
		let mut map = HashMap::new();
		for v in arr{
			let cnt = map.entry(v).or_insert(0);
			*cnt += 1;
		}
	
		let mut rst = 0;
		let mut rst_key = 0;
		for (k,v) in map{
			if v > rst{
				rst = v;
				rst_key = k;
			}
			println!("{k} : {v}");
		}
		println!("max-cnt is {rst_key}");
	}
	/* ========================================================================= */	
	
	#[cfg(feature = "default")]
	{
		println!("hello word!");
	}

}

未指定特性时,默认是打印hello word!

执行结果对比

运行cargo run --features "array_opt"

[1, 3, 3, 3, 4, 4, 5, 6, 8]
mid-val is 4
4 : 2
8 : 1
1 : 1
5 : 1
6 : 1
3 : 3
max-cnt is 3

运行cargo run

hello word!

总结

在学习过程中,使用这种条件编译还是很方便的,可以写一些测试代码练手,也不用经常去注释代码,既可以留存代码,又不影响代码可读性。当然,每个人的编程习惯不一样,也可以选择注释/反注释代码来调试,这里只提供一种调试方案。