【rust】rust条件编译

ops/2024/11/14 19:51:57/

在c语言中,条件编译是一个非常好用的功能,那么rust中如何实现条件编译呢?
rust的条件编译需要两个部分,一个是fratures,另一个是cfgCargo 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 dbususe 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);
}
}

http://www.ppmy.cn/ops/114358.html

相关文章

QT事件过滤器(1)

在 Qt 中,事件过滤是一种用于 拦截和处理对象事件 的机制。它允许一个对象监听和处理另一个对象的事件,比如键盘输入、鼠标点击等,而不必修改对象本身的代码。通过事件过滤,可以拦截并阻止事件的进一步传播。 事件机制概述 Qt 中…

pytorch实现RNN网络

目录 1.导包 2. 加载本地文本数据 3.构建循环神经网络层 4.初始化隐藏状态state 5.创建随机的数据,检测一下代码是否能正常运行 6. 构建一个完整的循环神经网络 7.模型训练 8.个人知识点理解 1.导包 import torch from torch import nn from torch.nn imp…

Spring Boot-热部署问题

Spring Boot 热部署问题分析与解决方案 热部署(Hot Deployment)是指在应用程序运行过程中,无需停止应用就可以动态加载新代码、配置或资源,从而提升开发效率。在 Spring Boot 开发中,热部署是一项非常实用的功能&…

创建一个带有 F6 快捷键的自动点击器

创建一个带有 F6 快捷键的自动点击器 在许多情况下,自动化点击任务可以帮助我们节省大量时间和精力。本文将介绍如何使用 Python 和 Tkinter 创建一个简单的自动点击器,并通过 F6 键作为快捷键来控制点击器的开始和停止,即使应用程序在后台也…

P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接* 最小瓶颈生成树题,和货车运输完全一样。 先简化题意, 次询问,每次给出 ,问 到 的所有路径集合中,最小边权的最大值。 对于这种题可以用kruskal生成树来做,也可以用倍增来写,但不…

JSON.parseArray 内存溢出

实际上我的JSON如下: 如果用以下代码:JVM的内存直接飙到内存溢出,报错OutOfMemoryError: Java heap space Object oo JSON.parseArray(json, TestVo.class) 如果我换成了这样,就没事: Object oo JSON.parseObject(…

MISC - 第一天(stegsolve图片隐写解析器、QR research、binwalk,dd文件分离,十六进制文件编辑器)

前言 各位师傅大家好,我是qmx_07,最近更新Buuctf在线测评中的MISC杂项内容 介绍 BUUCTF:https://buuoj.cn/ ,整合了各大 CTF 赛事题目,类型丰富,涵盖了Web 安全、密码学、系统安全、逆向工程、代码审计等多个领域 …

VUE面试题(单页应用及其首屏加载速度慢的问题)

目录 一、单页应用 1.概念 2.单页面应用的优缺点 二、多页面应用: 1.概念 2.区别 三、SPA的实现 1.原理 2.方式: 3.Hash与History模式有什么区别 四、首屏加载速度慢如何优化 1.什么是首屏加载? 2.首屏加载慢的原因 3.如何解决…