rust条件编译

2020-08-31  本文已影响0人  子由

条件编译的使用方法

两种操作方式进行rust的条件编译

  1. cfg属性:在属性的位置标注 #[cfg(...)]
    例如
#[cfg(target_os = "windows")]
mod os {
  // windows相关结构方法代码
  ...
} 
#[cfg(target_os = "linux")]
mod os {
  // linux相关结构方法代码
  ...
} 
  1. cfg宏:在条件表达式中使用cfg!(...)
    例如
if cfg!(target_os = "windows") {
  // windows系统要执行的代码段
} else if cfg!(target_os = "linux") {
  // linux系统要执行的代码段
}

除了按系统类型条件编译外,rust还支持以下类型条件:

此外rust支持使用any,all,not等限定条件编译的条件之间的关系

比如

// 这个函数仅当操作系统不是Linux 时才会编译
#[cfg(not(target_os = "linux"))]
fn not_linux() {
    println!("You are not running linux!");
}

// 这个函数当为macos**或者**ios时才会编译
#[cfg(any(target_os = "macos", target_os="ios"))]
fn you_are_apple {
  println!("You are running macos or ios");
}

// 这个函数当为32位的Unix系统时才会编译
#[cfg(all(unix, target_pointer_width = "32"))]
fn on_32bit_unix() {
  println!("You are running 32 bit unix");
}

自定义条件

自定义条件的属性标注方式如下:

#[cfg(some_condition)]
fn conditional_function() {
    println!("condition met!")
}

fn main() {
    conditional_function();
}

target_os等rustc已经支持的条件可以隐式判断进行编译,而自定义条件,需要在编译需要显式指定编译条件。

  1. 使用rustc 编译
$ rustc custom.rs && ./custom
No such file or directory (os error 2)

以上编译方式会报错,因为直接执行编译找不到条件下的conditional_function方法
需要使用以下方法编译:

$ rustc --cfg some_condition custom.rs && ./custom
condition met!
  1. 使用cargo编译
    首先,需要在cargo.toml文件里增加以下内容
[features]
some_condition = []

直接执行cargo build会报错找不到方法
正确方法应该使用以下方式编译:

$ cargo build --features some_condition
上一篇下一篇

猜你喜欢

热点阅读