2411rust,编译时自动检查配置
原文
Cargo和编译器团队很高兴地宣布,从Rust1.80(或nightly-2024-05-05)开始,会自动检查每个可访问的#[cfg],看看是否与期望的配置名和值匹配.
这帮助验证crate,是否正确处理不同目标平台或函数的条件编译.它确保在期望和使用设置的配置间保持一致,帮助在开发过程的早期抓住潜在的错误.
特征一览
每次声明Cargo特征时,都会按传递给rustc(Rust编译器)的配置转换,这样可与周知的配置一起验证#[cfg],#![cfg_attr]和cfg!的配置是否有意外,并使用unexpected_cfgs检查来报告警告.
Cargo.toml中:
[package]
name = "foo"
[features]
lasers = []
zapping = []
src/lib.rs:
#[cfg(feature = "lasers")] //此条件是期望的,因为`"lasers"`是`'feature'`cfg`的期望值
fn shoot_lasers() {}
#[cfg(feature = "monkeys")] //它是意外的,因为`"monkeys"`不是`'feature'cfg`的期望值
fn write_shakespeare() {}
#[cfg(windosw)] //它是意外的,它应该是`"窗口"`
fn win() {}
需要自定义配置
更新:此节是在nightly-2024-05-19的发布中添加的.
从Cargo来看:自定义配置既不是由rustc定义的,也不是由Cargo函数定义的.想想tokio_unstable,has_foo.......但不是feature="lasers",unix或debug_assertions.
一些crate可用自定义配置,如loom,fuzzing或期望从环境中取得(RUSTFLAGS或其他方式)且在编译时总是是静态已知的tokio_unstable.
对这些,Cargo通过[lints]表来如期静态声明这些配置.
通过在[lints.rust.unexpected_cfgs]下的特殊check-cfg配置,如期定义这些自定义配置:
Cargo.toml文件
[lints.rust]
unexpected_cfgs = { level = "warn", checkcfg = ['cfg(loom)', 'cfg(fuzzing)'] }
构建脚本中的自定义配置
另一方面,一些crate使用由build.rs中的某些逻辑启用的自定义配置.对这些crate,Cargo提供了一个新指令:cargo::rustc-check-cfg(或较旧的Cargo版本的cargo:rustc-check-cfg).
在rustcbook检查配置节描述了使用的语法,总之,--check-cfg的基本语法是:
cfg(name, values("value1", "value2", ..., "valueN"))
注意,无论配置是否活动,每个自定义配置都必须总是是期望的!
build.rs示例
build.rs:
fn main() {println!("cargo::rustccheckcfg=cfg(has_foo)");//^^^^^^^^^^^^^^^^^^^^^^`Cargo1.80`的新功能if has_foo() {println!("cargo::rustccfg=has_foo");}
}
每个cargo::rustccfg都应该有一个附带的无条件cargo::rustc-check-cfg指令,以避免此警告:未期望的条件名:has_foo.
等价表
| 第一列 | 第二列 |
|---|---|
货物::rustc-cfg | 货物::rustc-check-cfg |
foo | cfg(foo)或cfg(foo,values(none())) |
foo="" | cfg(foo,values("")) |
foo="bar" | cfg(foo,values("bar")) |
foo="1"和foo="2" | cfg(foo,values("1","2")) |
foo="1"和bar="2" | cfg(foo,values("1"))和cfg(bar,values("2")) |
foo和foo="bar" | cfg(foo,values(none(),"bar")) |
常见问题解答
可禁止吗
对Cargo用户,该功能总是打开且无法禁止,但与其他检查一样,可控制它:#![warn(unexpected_cfgs)].
检查是否会影响依赖
不会,和大多数检查一样,因为cap-lints,unexpected_cfgs只会报告本地包.
它如何与RUSTFLAGS环境交互
应该可如前使用RUSTFLAGS环境变量.当前不检查--配置参数,只检查代码中的用法.
即RUSTFLAGS="--cfg tokio_unstable" cargo check不会报告警告,除非在本地crate中使用tokio_unstable,此时,crate作者需要确保该crate的`build.
rs中带cargo::rustccheckcfg的自定义配置`.
如何在没有build.rs时期待自定义配置
更新:nightly-2024-05-19的Cargo现在提供[lints.rust.unexpected_cfgs.checkcfg]配置来定位静态已知的自定义配置.
如果Crate作者不想使用build.rs且不能[lints.rust.unexpected_cfgs.checkcfg],鼓励他们改用Cargo特征.
它如何与其他构建系统交互
默认,不基于Cargo的构建系统不受检查的影响.想拥有相同特征的构建系统作者应该查看rustc文档中的--checkcfg标志,以取如何实现相同功能的详细说明.
稳定实现和RFC3013有很大的不同,特别是--check-cfg只有一个形式:cfg()而不是values()和names()不完整且彼此不兼容.
cargo::rustccheckcfg将在Rust1.80(或nightly-2024-05-05)中开始工作.从Rust1.77到Rust1.79(含)会静默忽略它.在Rust1.76及更低版本中,在没有不稳定的Cargo标志-Zcheck-cfg时使用时会发出警告.
相关文章:
2411rust,编译时自动检查配置
原文 Cargo和编译器团队很高兴地宣布,从Rust1.80(或nightly-2024-05-05)开始,会自动检查每个可访问的#[cfg],看看是否与期望的配置名和值匹配. 这帮助验证crate,是否正确处理不同目标平台或函数的条件编译.它确保在期望和使用设置的配置间保持一致,帮助在开发过程的早期抓住潜…...
在 Ubuntu 中用 VSCode 配置 C 语言项目的编译与调试(详解教程)
目录 一、准备工作二、配置 VSCode 的编译任务三、配置 VSCode 的调试任务四、编译与调试流程五、常见问题排查六、总结 在 C 语言开发过程中,调试与编译是不可缺少的环节,而 VSCode(Visual Studio Code)作为一个强大且轻量级的编…...
MATLAB绘制克莱因瓶
MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…...
HTML5实现趣味飞船捡金币小游戏(附源码)
文章目录 1.设计来源1.1 主界面1.2 游戏中界面1.2 飞船边界框效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143799554 HTML5实现趣味飞船捡金币小游戏(附源码)&…...
Excel表数学于三角函数、统计函数
一、数学与三角函数 函数说明ABS返回数值的绝对值ACOS反余弦函数ACOSH反双曲余弦函数ASIN反正弦函数ASINH反双曲正弦函数ATAN反正切函数ATAN2以 x、y 坐标返回反正切值ATANH反双曲正切函数CEILING向上舍入(指定倍数的整数)COMBIN组合公式COS余弦函数COS…...
小试银河麒麟系统OCR软件
0 前言 今天在国产电脑上办公,需要从一些PDF文件中复制文字内容,但是这些PDF文件是图片转换生成的,不支持文字选择和复制,除了手工输入,我们还可以使用OCR。 1 什么是OCR OCR (Optical Character Recogni…...
Dubbo RPC线程模型
消费端线程模型,提供者端线程模型 消费端线程模型 对 2.7.5 版本之前的 Dubbo 应用,尤其是一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程…...
三角波生成函数
% 设置时间范围和采样频率 t 0:0.01:2; % 时间从0到2秒,步长为0.01秒% 定义频率 f 和角频率 theta f 5; % 频率为5Hz theta 2 * pi * f * t;% 初始化输出向量 y zeros(size(t));% 根据给定的公式计算 y for k 1:fy y (-1)^(k-1)*(2 /(k * pi)) * sin(k * the…...
使用Python实现对接Hadoop集群(通过Hive)并提供API接口
安装必要的库 首先,确保已经安装了以下库: pip install flask pip install pyhive代码实现 1. app.py(主应用文件) from flask import Flask, jsonify, request, abort from pyhive import hive import re from datetime impo…...
Qt学习笔记(四)多线程
系列文章目录 Qt开发笔记(一)Qt的基础知识及环境编译(泰山派) Qt学习笔记(二)Qt 信号与槽 Qt学习笔记(三)网络编程 Qt学习笔记(四)多线程 文章目录 系列文章…...
java的小数计算如何保证精度不丢失
前言 学java的肯定都知道,要保证小数运算精度不丢失我们得用BigDecimal对象。这篇文章就分析一下为什么用浮点数会造成精度丢失?BigDecimal是怎么解决精度丢失问题的?下面我们一起看看吧! 浮点数的表示 浮点数在计算机中通常采用 IEEE 75…...
分布式----Ceph应用(下)
目录 创建 Ceph 对象存储系统 RGW 接口 1、对象存储概念 2、创建 RGW 接口 //在管理节点创建一个 RGW 守护进程(生产环境下此进程一般需要高可用,后续介绍) //开启 httphttps ,更改监听端口 //创建 RadosGW 账户 //S3 接口…...
小鹏汽车嵌入式面试题及参考答案
static 变量放在哪个段中? 在 C 和 C++ 等编程语言中,static 变量根据其定义的位置不同放置的段也不同。对于全局的静态变量(在函数体外定义的静态变量),它会被放在数据段(.data 段或者.bss 段)。如果这个静态变量被初始化了非零值,那么它会被放在.data 段,这个段存储…...
qt5半成品飞机大战小游戏
最近在学Qt,心血来潮做了个飞机大战小游戏,由于一些资源比较难找,就做了个半成品。效果图如下: 目前已做功能:人物飞机的自由移动,子弹的发射,子弹与敌机的物体碰撞,碰撞特效。 缺少功能&#x…...
一文速学---红黑树
文章目录 一、红黑树简介二、 红黑树特性三、红黑树插入3.1 红黑树为空3.2 父节点为黑色3.3 父节点为红色3.3.1 父亲和叔叔都是红色3.3.2 父节点为红色,叔叔节点为黑色3.3.2.1 父节点在左节点,插入节点在父亲左节点3.3.2.2 父节点在左节点,插…...
【graphics】图形绘制 C++
众所周知,周知所众,图形绘制对于竞赛学僧毫无用处,所以这个文章,专门对相关人员教学(成长中的码农、高中僧、大学僧)。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…...
全志科技嵌入式面试题及参考答案
C 语言的编译过程是怎样的? C 语言的编译过程主要包括以下几个阶段。 首先是预处理阶段。在这个阶段,预处理器会处理以 “#” 开头的预处理指令。比如 #include 指令会把指定的头文件内容插入到当前的源文件中,这使得我们可以在程序中使用标准库函数或者自定义头文件中的声明…...
html 图片转svg 并使用svg路径来裁剪html元素
1.png转svg 工具地址: Vectorizer – 免费图像矢量化 打开svg图片,复制其中的path中的d标签的路径 查看生成的svg路径是否正确 在线SVG路径预览工具 - UU在线工具 2.在html中使用svg路径 <svg xmlns"http://www.w3.org/2000/svg" width"318px" height…...
Wallpaper壁纸制作学习记录01
导入图像 打开wallpaper软件,找到下方的播放列表,选择壁纸编辑器。 弹出下列界面,在创建壁纸处可以选择图片拖入。 在开始导入任何图像之前,请首先确保主背景图像表示实际屏幕分辨率。展示示例图像是 1920 x 1080,这…...
【深度学习】wsl-ubuntu深度学习基本配置
配置pip镜像源 这里注意一点,你换了源之后就最好不要开代理了,要不然搞不好下载失败,pip和conda都是 ## 配置中科大镜像 pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple# 配置阿里源 pip config set global…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
