当前位置: 首页 > article >正文

【rust】rust条件编译

在c语言中,条件编译是一个非常好用的功能,那么rust中如何实现条件编译呢?
rust的条件编译需要两个部分,一个是fratures,另一个是cfgCargo feature是一个非常强大的功能,可以提供条件编译和可选依赖项的高级特性,这里只用条件编译功能

1 条件编译

在C语言中,条件编译需要先使用#defien XXX定义变量,然后再使用#ifdef XXX, #endif判断编译条件。那么在rust语言中如何实现呢?

1.1 定义变量

这一步相当于C语言中的变量的定义,即#defien XXX功能。
cargo.toml文件中使用feature,使用方式如下:

[features]
dbug = []
udug = []

上述代码相当于是有了两个编译条件

1.2 条件编译

在C语言中,条件编译的实现是#ifdef,在rust中则是使用#[cfg()]或者cfg!宏实现,代码如下:

#[cfg(feature = "dbus")] 
{
	println!("dbus");
    printf_dbus();
}

// 或者
if cfg!(feature = "dbus") {
	println!("dbus");
	printf_dbus(); 
}

1.3 整个文件都需要使用条件编译

当整个文件都需要使用条件编译的时候,可以直接在文件的最开始使用#[cfg()]。假设dbus.rs整体都需要条件编译,示例如下:

#[cfg(feature = "dbus")]
pub mod debus {
	struct xxxx{
	}
	
	pub fn dbus_xxxx() 
	{
	}
}

使用该文件中的函数

mod dbususe 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条件编译
目录结构
在这里插入图片描述

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);
}
}

http://www.kler.cn/news/310017.html

相关文章:

  • 【linux-Day3】linux的基本指令<中>
  • 打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程
  • pycv实时目标检测快速实现
  • 120页ppt丨集团公司战略规划内容、方法、步骤及战略规划案例研究
  • 分类预测|基于粒子群优化径向基神经网络的数据分类预测Matlab程序PSO-RBF 多特征输入多类别输出 含基础RBF程序
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战8-自定义组件-组件通信
  • 江科大笔记—STM32课程简介
  • 基于SpringBoot+Vue+MySQL的家乡特色推荐系统
  • 英飞凌—TC377芯片详解(1)
  • npm包管理工具
  • UGit:腾讯自研的Git客户端新宠
  • Spring如何处理线程并发问题?
  • 传输层协议 —— UDP协议
  • LXDE lxpanel桌面环境中打开一个终端窗口 lxterminal
  • PHP 中传值与传引用的区别
  • 线程有哪几种状态?
  • web杂项
  • 腾讯云技术深度探索:构建高效云原生微服务架构
  • Java Stream API | Java Stream API 中 `filter()`的使用
  • TCP/IP Socket用于测试免费使用的服务器端
  • window下idea中scala的配置
  • web基础—dvwa靶场(五)File Upload
  • HarmonyOS开发之自定义构建函数
  • gi清除无用缓存
  • 【Elasticsearch系列】Elasticsearch中的分页
  • Python用TOPSIS熵权法重构粮食系统及期刊指标权重多属性决策MCDM研究|附数据代码
  • 利用物化视图刷新同步表记录(2-rowid)
  • 828华为云征文|Flexus云服务器X实例部署宝塔运维面板
  • 大数据处理技术:分布式文件系统HDFS
  • 基础漏洞——SQL注入原理和利用