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.hqwc.cn/news/570702.html

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

相关文章

jupyter lab使用虚拟环境

python -m ipykernel install --name 虚拟环境名 --display-name 虚拟环境名然后再启动jupyter lab就行了

项目设计方案:市交通视频监控平台项目设计方案(二)

目录 1 前言 1.1 目的 1.2 适用范围 1.3 术语表 2 现状分析 2.1 业务现状 2.2 组织机构现状 2.3 存在的问题 2.4 项目成果预期 3 系统建设原则 4 项目需求 4.1 项目需求 4.1.1 业务需求主要分为三部分: 4.1.2 技术需求主要分为四部分: 4.…

SpringBoot可以同时处理多少请求

SpringBoot默认的内嵌容器是Tomcat,即看Tomcat可以处理多少请求 默认配置 server:tomcat:threads:min-spare: 10 # 最小工作线程数max: 200 # 最大线程数max-connections: 8192 # 接受和处理的最大连接数,超过8192的请求就会被放入到等待队列中ac…

52个AIGC视频生成算法模型介绍

基于Diffusion模型的AIGC生成算法日益火热,其中文生图,图生图等图像生成技术普遍成熟,很多算法从业者开始从事视频生成算法的研究和开发,原因是视频生成领域相对空白。 AIGC视频算法发展现状 从2023年开始,AIGC视频的新…

安全漏洞周报(2024.03.18-2024.03.25)

漏洞速览 ■ Atlassian Confluence 路径遍历漏洞(CVE-2024-21677) ■用友U8cloud SQL注入漏洞 漏洞详情 1.Atlassian Confluence 路径遍历漏洞(CVE-2024-21677) 影响组件: Atlassian Confluence Data Center是面向大型企业和组织的高可用性、可扩展性和高性能版本…

IDEA编辑国际化.properties文件没有Resource Bundle怎么办?

问题描述 最近在做SpringBoot国际化,IDEA添加了messages.properties、messages_en_US.properties、messages_zh_CN.properties国际化文件后,在编辑页面底部没有Resource Bundle,这使得我在写keyvalue的时候在每个properties文件都要拷贝一次…

微信小程序使用Vant组件库流程

目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。这样开发原生微信小程序的会方便很多。 官方网址:Vant Weapp - 轻量、可靠的小程序 UI 组件库 步骤一 通过 npm 安装 npm i vant/weap…

SpringCloud-Eureker配置中心搭建

一、基于本地配置文件的 Eureker配置中心搭建 1.、创建一个springBoot项目 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version><component.version>0.0.1-SNAPSHOT</…

Qt 图形视图 /图形视图框架坐标系统的设计理念和使用方法

文章目录 概述Qt 坐标系统图形视图的渲染过程Item图形项坐标系Scene场景坐标系View视图坐标系map坐标映射场景坐标转项坐标视图坐标转图形项坐标图形项之间的坐标转换 其他 概述 The Graphics View Coordinate System 图形视图坐标系统是Qt图形视图框架的重要组成部分&#xf…

模板设计模式经典案例

模板设计模式讲究的是将不变的设置为基类&#xff0c;将变的设置为虚函数来让子类实现。下面就以这样的写下模板设计模式的例子。 例子场景 一个工程步骤分为step1,step2&#xff0c;其中step1由总工程指定&#xff0c;step2由子工程指定&#xff0c;最后由一个函数串起来&am…

鸿蒙OS应用开发:【DevEco Studio3.0 和 3.1版本差异】

工程模板和开发语言介绍 DevEco Studio支持包括手机、平板、车机、智慧屏、智能穿戴、轻量级智能穿戴和智慧视觉设备的HarmonyOS应用/服务开发&#xff0c;预置了工程模板&#xff0c;可以根据工程向导轻松创建适应于各类设备的工程&#xff0c;并自动生成对应的代码和资源模板…

[HackMyVM]靶场Crossbow

kali:192.168.56.104 靶机:192.168.56.136 端口扫描 # nmap 192.168.56.136 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-26 22:17 CST Nmap scan report for crossbow.hmv (192.168.56.136) Host is up (0.0057s latency). Not shown: 997 closed tcp…