rust中常用cfg属性和cfg!宏的使用说明,实现不同系统的条件编译

cfg有两种使用方式,一种是属性: #[cfg()],一种是宏:cfg! ,这两个都是非常常用的功能。

#[cfg()]是 Rust 中的一个属性

用于根据配置条件来选择性地包含或排除代码。cfg 是 "configuration" 的缩写,用于控制在不同的构建环境或平台上编译和执行不同的代码块。在不同的操作系统上会编译不同的函数示例:

#[cfg(target_os = "linux")]
fn get_os_info(){println!("linux");
}#[cfg(target_os = "windows")]
fn get_os_info() {println!("windows");
}fn main() {get_os_info();
}

也可使用not表达式:在非 linux 系统下会编译此函数

#[cfg(not(target_os = "linux"))]
fn get_os_info() {println!("not linux");
}

#[cfg()] 属性可以用于函数、结构体、枚举、模块、模块导入等各种代码元素,以及条件编译块(#[cfg()] 包围的代码块)。它使用一个或多个条件表达式来指定编译时要包含或排除的代码。条件表达式可以是 Rust 的预定义属性、环境变量、操作系统类型、目标架构等。

#[cfg()] 属性中使用的逻辑运算符有以下几种:

  1. all(expr1, expr2, ...):逻辑与运算符,要求所有条件表达式都为真才返回真。例如:#[cfg(all(feature = "foo", target_os = "linux"))] 表示只有在启用 "foo" 功能并且目标操作系统是 Linux 时条件成立。
  2. any(expr1, expr2, ...):逻辑或运算符,只要有任一条件表达式为真就返回真。例如:#[cfg(any(feature = "foo", feature = "bar"))] 表示只要启用 "foo" 或 "bar" 中的任意一个功能时条件成立。
  3. not(expr):逻辑非运算符,对条件表达式取反。例如:#[cfg(not(debug_assertions))] 表示只有在非调试断言模式下条件成立。

以下是一些示例用法:

#[cfg(target_os = "linux")]
fn only_on_linux() {// 仅在 Linux 系统上编译和执行的代码
}#[cfg(all(unix, not(target_os = "linux")))]
fn on_unix_but_not_linux() {// 仅在 Unix 系统但不是 Linux 上编译和执行的代码
}#[cfg(any(windows, target_os = "macos"))]
fn on_windows_or_macos() {// 仅在 Windows 或 macOS 上编译和执行的代码
}#[cfg(not(debug_assertions))]
fn when_not_debug_assertions() {// 仅在非调试断言模式下编译和执行的代码
}#[cfg(feature = "my_feature")]
fn with_my_feature_enabled() {// 仅在启用 "my_feature" 功能时编译和执行的代码
}

在这些示例中,#[cfg()] 属性根据不同的条件表达式来控制代码的编译和执行。根据配置条件的不同,编译器会选择性地包含或排除相应的代码。

#[cfg()] 属性可以根据不同的需求来组合条件表达式,并支持各种逻辑运算符(如 allanynot)来组合条件。你可以根据特定的配置条件来编写平台特定的代码、功能开关的代码、调试模式的代码等。

注意:#[cfg()] 属性是在编译时进行判断和处理的,不会在运行时起作用。因此,通过使用不同的配置条件,你可以在不同的构建环境中选择性地编译和执行特定的代码块。

cfg!宏的方法

判断操作系统,执行不同的代码块:

if cfg!(target_os = "linux") {println!("linux");} else {println!("not linux");}

比如执行cmd命令还是shell命令:

use std::process::Command;// cmd_str可以是从输入流读取或从文件里读取
let cmd_str: String;
if cfg!(target_os = "windows") {// 这里不用\\而是/的话会被windows认为/tmp的/t是一个option而报错cmd_str = "dir d:\\tmp".to_string();
} else {cmd_str = "dir /usr/tmp".to_string();
}let output = if cfg!(target_os = "windows") {Command::new("cmd").arg("/c").arg(cmd_str).output().expect("cmd exec error!")
} else {Command::new("sh").arg("-c").arg(cmd_str).output().expect("sh exec error!")
}let output_str = String::from_utf8_lossy(&output.stdout);
println!("{}", output_str);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web举例:防火墙二层,上下行连接交换机的主备备份组网

Web举例:防火墙二层,上下行连接交换机的主备备份组网 介绍了业务接口工作在二层,上下行连接交换机的主备备份组网的Web举例。 组网需求 如图1所示,两台FW的业务接口都工作在二层,上下行分别连接交换机。FW的上下行业…

中小型集群部署,Docker Swarm(集群)使用及部署应用介绍

1、Docker Swarm简介 说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管…

Go语言学习Day4:函数(上)

名人说:莫愁千里路,自有到来风。 ——钱珝 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、函数的概念与定义①函数的概念②函数的具体定义③多返回值 2、函数参数与作用域①可变参数②形…

【零基础C语言】文件操作

目录 理解文件操作 什么是文件 程序文件 数据文件 文件名字 二进制文件和文本文件 文件的打开和关闭 文件的打开和关闭操作 实验1,打开一个文件并且输入26个字母 打开读取文件text.txt ,并且将它拷贝进text_cpy.txt 使用 fputs 和 fgets 函数 使用 fprintf函…

【计算机网络】IP 协议

网络层IP协议 一、认识 IP 地址二、IP 协议报头格式三、网段划分1. 初识子网划分2. 理解子网划分3. 子网掩码4. 特殊的 IP 地址5. IP 地址的数量限制6. 私有 IP 地址和公网 IP 地址7. 理解全球网络(1)理解公网(2)理解私网&#xf…

华为汽车图谱

极狐 极狐(ARCFOX)是由北汽、华为、戴姆勒、麦格纳等联合打造。总部位于北京蓝谷。 问界 华为与赛力斯(东风小康)合作的成果。 阿维塔 阿维塔(AVATR)是由长安汽车、华为、宁德时代三方联合打造。公司总部位…

canal: 连接kafka (docker)

一、确保mysql binlog开启并使用ROW作为日志格式 docker 启动mysql 5.7配置文件 my.cnf [mysqld] log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server-id1一定要确保上述两个值一个为ROW,一个为ON 二、下载canal的run.sh https://github.c…

一周学会Django5 Python Web开发-Django5模型定义

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计41条视频,包括:2024版 Django5 Python we…

26. BI - PageRank 拓展以及如何利用 networkx 来分析希拉里丑闻

本文为 「茶桁的 AI 秘籍 - BI 篇 第 26 篇」 Hi, 我是茶桁. 上节课咱们讲解了 PageRank 的两种模型, 并分别做了代码上的演示. 这节课, 让我们来看看 PageRank 的影响力及其应用. PageRank 已经超越了原来提出来的模型, 因为 PageRank 的影响力影响到了后续很多的一些模型, …

我的创作纪念日 ---- 2024/3/26

前言 2024.3.26是我在CSDN成为创作者的第128天,也是我第一次真正在网上创作的第128天 当我还在日常创作时,突然发现我收到了一封信 我想我可以分享一下这段时间的感想以及收获 机缘 在CSDN的这段时间里,我学习到了很多知识,也…

数据结构——链表(单链表)

大家好,又是我(小锋),今天给大家带了一个比较有挑战的章节(链表),但是不用担心,小锋会陪大家一起度过。 顺序表的思考与问题 1. 中间/头部的插入删除,时间复杂度为O(N) …

【python】flask模板渲染引擎Jinja2,通过后端数据渲染前端页面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Spring Cloud 八:微服务架构中的数据管理

Spring Cloud 一:Spring Cloud 简介 Spring Cloud 二:核心组件解析 Spring Cloud 三:API网关深入探索与实战应用 Spring Cloud 四:微服务治理与安全 Spring Cloud 五:Spring Cloud与持续集成/持续部署(CI/C…

Eladmin-jpa基于SpringBoot和Vue的前后端分离后台管理系统​

在当今快速发展的软件开发领域,前后端分离的架构模式已经成为主流。这种架构模式不仅可以提高开发效率,还能使系统更加易于维护和扩展。Eladmin-jpa是一个基于Spring Boot 2.6.4、Spring Boot Jpa、JWT、Spring Security、Redis和Vue的前后端分离的后台管…

JS等比压缩图片方法

AI给出来的答案,AI真的能改变世界,以后程序员这个职业真的有可能不存在了。 function compressImage(image, callback) {// 创建一个 canvas 元素const canvas document.createElement(canvas);canvas.width 48;canvas.height 48;// 获取 canvas 的绘…

[WTL/Win32]_[初级]_[如何设置ListView的列宽不出现水平滚动条]

场景 开发WTL/Win32的程序时,经常会用到表格控件CListViewCtrl。这个控件需要设置列的宽度,当用完100%的宽度来平均分配给列宽时,一加载数据多,就会出现垂直滚动条后,水平滚动条也会同时出现的问题。怎么设置才能让水…

【研发日记】Matlab/Simulink开箱报告(十)——Signal Routing模块模块

文章目录 前言 Signal Routing模块 虚拟模块和虚拟信号 Mux和Demux Vector Concatenate和Selector Bus Creator和Bus Selector 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Fun…

单链表专题(上)(顺序表链表线性表)

在开始之前思考一个顺序表的问题 1. 中间/头部的插⼊删除,时间 复杂度为O(N) 2. 增容需要申请新空间,拷⻉数据,释放旧空间。会有不⼩的消耗。 3. 增容⼀般是呈2倍的增⻓,势必会有⼀定的空间浪费。例如当前容量为100,…

订单系统-RPC快速入门

RPC快速入门 概述 关于rpc,只需要知道他是一种协议,项目之间能够远程调用函数。 快速入门 我们前边下载好的两个包,在idea中打开之后,我们创建这么几个文件夹。 至于是干什么的,以后细说。创建好之后我们在produc…

从零开始搭建游戏服务器 第七节 创建GameServer

目录 前言正文创建GameServer模块修改配置创建NettyClient连接到登录服登录服修改创建协议游戏服注册到登录服 总结 前言 上一节我们使用自定义注解反射简化了协议解包和逻辑处理分发流程。 那么到了这里登录服登录服的架构已经搭建的差不多了,一些比较简单的、并发…