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

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

相关文章:

【rust】rust条件编译

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

一键文本提示实现图像对象高质量剪切与透明背景生成

按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…...

游戏客服精华回复快捷语大全

以黑神话悟空为代表的国内的游戏行业,最近发展非常迅猛,大量游戏玩家需要足够的游戏客服支持,这里整理了游戏客服精华回复快捷语,涵盖了接待客户,游戏级数,游戏外挂,游戏要求,游戏特…...

国内版Microsoft Teams 基础版部署方案

目录 前言Microsoft Teams简介部署前的准备 环境需求账户和许可网络要求部署步骤 初步配置和设置安装Microsoft Teams客户端Teams管理中心配置用户管理 用户添加与分配角色与权限管理通讯与协作 团队和频道管理即时消息和会议功能文件共享与协作安全性与合规性 数据保护措施合规…...

计算机网络 ---- OSI参考模型TCP/IP模型

目录 一、OSI参考模型 1.1 学习路线 1.2 OSI参考模型和TCP/IP模型 1.3 具体设备与具体层次对应关系 1.3.1 物理层 1.3.2 数据链路层 1.3.3 网络层 1.3.4 传输层 1.3.5 会话层、表示层、应用层 1.4 各层次数据传输单位 二、TCP/IP模型 2.1 学习路线 2.2 TCP/I…...

在Windows环境下部署Java的Web项目集成工具的整体流程和详细步骤

好的,以下是一份关于“Windows环境下部署Java的Web项目集成工具”的手把手操作流程,由浅入深,先整体后分部: 一、引言 在现代软件开发中,Java作为一种广泛应用的编程语言,其Web项目开发尤为常见。为了提高…...

9.18作业

提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格、其他字符的个数并输出 代码展示 #include <iostream>using namespace std;int main() {string str;int countc 0; // 字母计数int countn 0; // 数字计数int count 0; // 空格计数int counto 0;…...

【算法】滑动窗口—最小覆盖子串

题目 ”最小覆盖子串“问题&#xff0c;难度为Hard&#xff0c;题目如下&#xff1a; 给你两个字符串 S 和 T&#xff0c;请你在 S 中找到包含 T 中全部字母的最短子串。如果 S 中没有这样一个子串&#xff0c;则算法返回空串&#xff0c;如果存在这样一个子串&#xff0c;则可…...

“Fast-forward“ in git-pull result

当你执行 git pull 并且结果显示 Fast-forward 时&#xff0c;这意味着你的本地分支可以直接快进到远程分支的最新提交&#xff0c;没有任何冲突或者需要合并的内容。具体来说&#xff0c;Fast-forward 是一种合并方式&#xff0c;它的特点是将当前分支的指针直接移动到远程分支…...

Oracle(133)如何创建表空间(Tablespace)?

在Oracle数据库中&#xff0c;表空间&#xff08;Tablespace&#xff09;是存储数据的逻辑单位&#xff0c;它由一个或多个数据文件组成。表空间是数据库数据管理的基本结构&#xff0c;了解如何创建表空间对于数据库管理员至关重要。 创建表空间的基本语法 创建表空间的基本…...

Linux中权限和指令

&#x1f4a5;1、Linux基本指令 1.1 mv 指令 mv指令是move的缩写&#xff0c;用来移动或重命名文件、目录&#xff0c;经常用来备份文件或目录。 mv old_name new_name&#xff1a; 重命名文件或目录mv file /path/to/directory&#xff1a; 移动文件到指定目录 roothcss-ecs…...

本地镜像发布到阿里云

本地镜像发布到阿里云 登录阿里云容器镜像服务配置 Docker 登录阿里云容器镜像服务标记你的 Docker 镜像推送镜像到阿里云验证使用阿里云镜像注意事项 将 Docker 本地镜像发布到阿里云&#xff08;Alibaba Cloud&#xff09;容器镜像服务&#xff08;Container Registry&#x…...

【Linux】【Vim】Vim 基础

Vim/Gvim 基础 文本编辑基础编辑操作符命令和位移改变文本重复改动Visual 模式移动文本(复制、粘贴)文本对象替换模式 光标移动以 word 为单位移动行首和行尾行内指定单字符移动到匹配的括号光标移动到指定行滚屏简单查找 /string标记 分屏vimdiff 文本编辑 基础编辑 Normal 模…...

计算机人工智能前沿进展-大语言模型方向-2024-09-18

计算机人工智能前沿进展-大语言模型方向-2024-09-18 1. The Application of Large Language Models in Primary Healthcare Services and the Challenges W YAN, J HU, H ZENG, M LIU, W LIANG - Chinese General Practice, 2024 人工智能大语言模型在基层医疗卫生服务中的应…...

ubuntu24安装vivado24(安装并解决若干错误)

目录 安装方法&#xff1a;问题1&#xff1a;解决办法&#xff1a; 问题2&#xff1a;解决方法&#xff1a; 安装完成&#xff1a; 安装方法&#xff1a; 注意&#xff1a;内存最好预留80G空闲的。 安装好大小&#xff1a; 安装依赖库&#xff1a; sudo apt-get update sud…...

CSS实现文本溢出省略号或完整显示

目录 前言1. 省略号2. 完整展示3. Demo 前言 文本内容超出容器宽度的问题&#xff0c;为了保持页面布局的整洁&#xff0c;通常会使用省略号来隐藏多余的内容 一共有两种方式&#xff1a; 设定省略号完整展示 1. 省略号 文本溢出时显示省略号 .item-value {flex-basis: 7…...

three.js PropertyBinding和PropertyMixer

PropertyBinding 对场景图中某一真实属性的引用&#xff0c;内部使用。 构造器 PropertyBinding( rootNode : Object3D, path, parsedPath ) -- rootNode: -- path -- parsedPath (可选) 属性 # .path : Number # .parsedPath : Number # .node : Number # .rootNode …...

ssh远程连接try1账号切换tips

1&#xff0c;创建拥有sudo权限的用户&#xff1a; 在root下 sudo adduser bio sudo vim /etc/sudoers //修改添加如下&#xff1a; bio ALL(ALL) ALL //bio用户就拥有了root权限参考&#xff1a;https://github.com/isLishude/blog/issues/70 2&#xff0c;修改ssh配置 …...

C++之第十二课

课程列表 哎呀呀&#xff0c;失踪人口回归了&#xff01;&#xff08;前段时间跑去B站了&#xff0c;久等了&#xff09; 今天来讲——数组 有一道题是这样的&#xff1a; 有n个数&#xff0c;请输出其中最大的数。 原来我们就要&#xff1a; int a,b,c... 但是——数组…...

Linux硬连接、软连接和复制的区别

‌硬连接、软连接和复制在Linux系统中的主要区别体现在以下三点&#xff1a; 文件链接的方式文件独立性文件系统的操作上。‌ 一、硬连接 1. 硬连接是通过ln命令创建的&#xff0c;它为文件创建别名&#xff0c;与源文件共享同一inode号码&#xff0c;因此硬连接和源文件实际…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...