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的上下行业…

修改android11的默认桌面

要修改 Android 11 的默认桌面,通常需要使用第三方的启动器(Launcher)应用程序来替换系统默认的启动器。以下是一般步骤: 下载第三方启动器应用: 在 Google Play 商店或其他应用商店中搜索并下载你喜欢的第三方启动器应…

云服务器配置 docker-spark

云服务器配置 docker-spark 1. 安装2. 启动3. 查看4. 验证5. 其他 1. 安装 我的服务器是腾讯云轻量应用服务器,2 核 2 G,已经内置了 docker, 配置大概如下: ubuntuVM-20-5-ubuntu --------------------- OS: Ubuntu 22.04 LTS x…

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

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

企业安全建设与安全架构实践资料合集(附下载)

企业安全建设与安全架构实践资料合集,供大家参考学习。 知识星球下载:https://t.zsxq.com/18Kq8s0ov 一、企业安全建设与最佳实践 云时代企业安全建设.pdf 云安全服务管理指南.pdf 企业信息安全建设策略与实践.pdf 企业网络安全设计方案.pdf 企业安全建…

pytest和unittest 如何选择?

目录 如何选择?pytest和unittest哪个更强大pytest和unittest是否可同时应用如何选择? pytest和unittest都是Python中常用的测试框架,它们各自具有一些特点和优势,选择哪一个取决于你的具体需求和偏好。以下是一些关于这两个框架的对比和选择建议: 易用性和简洁性: pytes…

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

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

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

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

设计模式|发布-订阅模式(Publish-Subscribe Pattern)

文章目录 初识发布-订阅模式发布-订阅模式的关键概念发布订阅模式的优缺点示例代码(使用 Java 实现)有哪些知名框架使用了发布-订阅模式常见面试题 初识发布-订阅模式 发布-订阅模式(Publish-Subscribe Pattern)是一种软件架构设…

【python】(14)理解Python中的pypinyin库

系列文章回顾 【python】(01)初识装饰器Decorator 【python】(02)初识迭代器Iterator 【python】(03)初识生成器Generator 【python】(04)python中实现多任务并发和并行的区别 【python】(05)如何使用python中的logging模块记录日志信息 【python】(06)理解Python中的 lambda 、…

【计算机网络】IP 协议

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

华为汽车图谱

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

51单片机超声波测距代码

超声波测距代码&#xff1a; #include<reg52.h>sbit echoP2^0 ; //回声接收端口 sbit trigP2^1 ;//超声波触发端口sbit wei1P2^4; sbit wei2P2^5; sbit wei3P2^6; sbit wei4P2^7;sbit inP2^2;#define dula P0 #define uchar unsigned char #define uint unsigned intlo…

代码随想录Day58:每日温度、下一个更大元素 I

每日温度 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> result(temperatures.size(), 0);for(int i 0; i < temperatures.size(); i){while(!st.empty() && tempe…

数字化接口、网络身份证实名认证接口、C#实名认证接口说明示例

身份证实名认证接口是现代应用程序中的越来越重要的一部分&#xff0c;通过身份证识别接口来实现身份信息的提取与录入&#xff0c;实名认证接口通过核验身份证二要素、三要素的方式实时联网进行身份信息的真伪核验。 网民在进行网络活动时&#xff0c;均需要用户提供真实身份…

软考高级:常见中间件分类和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

canal: 连接kafka (docker)

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

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

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

C语言实现:变位词程序拓展问题

开篇 今天的问题&#xff0c;是在之前变位词程序的基础上&#xff0c;进行了一些拓展。问题来源于《编程珠玑》第2章&#xff0c;课后习题1。 问题概要 考虑查找给定输入单词的所有变位词问题&#xff0c;仅给定单词和字典的情况下&#xff0c;如何解决该问题&#xff1f;如果有…

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

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