当前位置: 首页 > news >正文

C++之fmt库介绍和使用(2)

C++之fmt库介绍与使用(2)


Author: Once Day Date: 2025年5月19日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客

参考文章:

  • Get Started - {fmt}
  • fmtlib/fmt: A modern formatting library

文章目录

  • C++之fmt库介绍与使用(2)
        • 3. 格式化API
          • 3.1 实用工具函数
          • 3.2 系统错误
          • 3.3 自定义分配器
          • 3.4 区域设置(Locale)
          • 3.5 旧版编译时检查
        • 4. 其他特性
          • 4.1 范围和元组格式化
          • 4.2 日期和时间格式化
          • 4.3 终端颜色和文本样式
          • 4.4 动态参数列表

3. 格式化API

fmt/format.h 定义了完整的格式化 API,提供额外的格式化函数和区域设置支持。

template <typename... T>
auto format(format_string<T...> fmt, T&&... args) -> std::string;#include <fmt/format.h>
std::string message = fmt::format("The answer is {}.", 42);

根据 fmt 中的规范格式化参数 args,并将结果作为字符串返回。

auto vformat(string_view fmt, format_args args) -⁠> std::string;template <detail::fixed_string S>
constexpr auto operator""_a();
3.1 实用工具函数
template <typename T>
auto ptr(T p) -> const void*;auto s = fmt::format("{}", fmt::ptr(p));

将指针 p 转换为 const void*,用于指针格式化。

template <typename Enum>
constexpr auto underlying(Enum e) -⁠> underlying_t<Enum>;enum class color { red, green, blue };
auto s = fmt::format("{}", fmt::underlying(color::red));  // s == "0"

将枚举值 e 转换为其底层类型。

template <typename T>
auto to_string(const T& value) -⁠> std::string;

将任意对象转换为字符串std::string对象。

template <typename T>
auto group_digits(T value) -⁠> group_digits_view<T>;fmt::print("{}", fmt::group_digits(12345));
// Output: "12,345"

返回一个视图,使用与区域设置无关的逗号 , 作为千位分隔符格式化整数值。

template <typename T>
class detail::buffer;constexpr auto size() -⁠> size_t; //返回缓冲区的大小。
constexpr auto capacity() -⁠> size_t; // 返回缓冲区的容量。
auto data() -> T*; // 返回指向缓冲区数据的指针(无空终止符)。
void clear();	   // 清空缓冲区。
void append(const U* begin, const U* end); // 将数据追加到缓冲区末尾。

具有可选增长能力的连续内存缓冲区。它是内部类,不应直接使用,需通过 memory_buffer 使用。

template <typename T, size_t SIZE, typename Allocator>
class basic_memory_buffer;// 这会将 "The answer is 42." 追加到 out 中。缓冲区内容可通过 to_string(out) 转换为 std::string。
auto out = fmt::memory_buffer();
fmt::format_to(std::back_inserter(out), "The answer is {}.", 42);// 通过移动构造函数从另一个对象转移内容。
basic_memory_buffer(basic_memory_buffer&& other);// 通过移动赋值运算符从另一个对象转移内容。
auto operator=(basic_memory_buffer&& other) -> basic_memory_buffer&;// 调整缓冲区大小以容纳 count 个元素。如果 T 是 POD 类型,新元素可能未初始化。
void resize(size_t count);// 将缓冲区容量增加到 new_capacity。
void reserve(size_t new_capacity);

为平凡可复制 / 构造的类型提供的动态增长内存缓冲区,前 SIZE 个元素存储在对象自身中。最常见的用法是通过 char 类型的 memory_buffer 别名。

3.2 系统错误

{fmt} 库不使用 errno 向用户传递错误信息,但可能会调用设置 errno 的系统函数。用户不应假设库函数会保留 errno 的值。

template <typename... T>
auto system_error(int error_code, format_string<T...> fmt, T&&... args) -> std::system_error;// 抛出 std::system_error,错误描述为 "cannot open file 'madeup': No such file or directory"(系统消息可能因环境而异)。
const char* filename = "madeup";
FILE* file = fopen(filename, "r");
if (!file)throw fmt::system_error(errno, "cannot open file '{}'", filename);

使用 fmt::format(fmt, args...) 格式化错误消息,构造 std::system_error 对象。error_codeerrno 提供的系统错误码。

void format_system_error(detail::buffer<char>& out, int error_code, const char* message);

为操作系统或语言运行时返回的错误(如文件打开错误)格式化错误消息,并写入 out。格式与 std::system_error(ec, message) 一致(其中 ecstd::error_code(error_code, std::generic_category()))。实现可能不同,但通常格式为:

<message>: <system-message>

其中 <message> 是传入的消息,<system-message> 是与错误码对应的系统消息。error_codeerrno 提供的系统错误码。

3.3 自定义分配器

{fmt} 库支持自定义动态内存分配器。自定义分配器类可作为模板参数指定给 fmt::basic_memory_buffer

using custom_memory_buffer = fmt::basic_memory_buffer<char, fmt::inline_buffer_size, custom_allocator>;

也可以编写使用自定义分配器的格式化函数:

using custom_string =std::basic_string<char, std::char_traits<char>, custom_allocator>;auto vformat(custom_allocator alloc, fmt::string_view fmt,fmt::format_args args) -> custom_string {auto buf = custom_memory_buffer(alloc);fmt::vformat_to(std::back_inserter(buf), fmt, args);return custom_string(buf.data(), buf.size(), alloc);
}template <typename ...Args>
auto format(custom_allocator alloc, fmt::string_view fmt,const Args& ... args) -> custom_string {return vformat(alloc, fmt, fmt::make_format_args(args...));
}

分配器仅用于输出容器。格式化函数通常不会为内置类型和字符串类型执行任何分配操作,除非是非默认的浮点格式化(偶尔会回退到 sprintf)。

3.4 区域设置(Locale)

默认情况下,所有格式化操作均与区域设置无关。使用 'L' 格式说明符可插入区域设置中的合适数字分隔符:

#include <fmt/core.h>
#include <locale>std::locale::global(std::locale("en_US.UTF-8"));
auto s = fmt::format("{:L}", 1000000);  // s == "1,000,000"

fmt/format.h 提供以下接受 std::locale 作为参数的格式化函数重载。locale 类型作为模板参数,避免引入开销较大的 <locale> 头文件:

template <typename... T>
auto format(detail::locale_ref loc, format_string<T...> fmt, T&&... args) -> std::string;template <typename OutputIt, typename... T>
auto format_to(OutputIt out, detail::locale_ref loc, format_string<T...> fmt, T&&... args) -> OutputIt;template <typename... T>
auto formatted_size(detail::locale_ref loc, format_string<T...> fmt, T&&... args) -> size_t;
3.5 旧版编译时检查

FMT_STRING 宏用于在旧版编译器上启用编译时检查,要求 C++14 或更高版本,在 C++11 中为无操作(no-op)。

FMT_STRING(s)
// 编译时错误:'d' 是字符串的无效说明符
std::string s = fmt::format(FMT_STRING("{:d}"), "foo");

从字符串字面量 s 构造旧版编译时格式字符串。

若要强制使用旧版编译时检查,定义预处理变量 FMT_ENFORCE_COMPILE_STRING。设置后,接受 FMT_STRING 的函数将无法使用常规字符串编译。

4. 其他特性
4.1 范围和元组格式化

fmt/ranges.h 为范围(ranges)和元组(tuples)提供格式化支持:

#include <fmt/ranges.h>fmt::print("{}", std::tuple<char, int>{'a', 42});
// 输出:('a', 42)

通过 fmt::join,可以使用自定义分隔符分隔元组元素:

#include <fmt/ranges.h>auto t = std::tuple<int, char>{1, 'a'};
fmt::print("{}", fmt::join(t, ", "));
// 输出:1, a
template <typename Range>
auto join(Range&& r, string_view sep) -> join_view<decltype(detail::range_begin(r)), decltype(detail::range_end(r))>;auto v = std::vector<int>{1, 2, 3};
fmt::print("{}", fmt::join(v, ", "));
// 输出:1, 2, 3// fmt::join 会将传递的格式说明符应用于范围元素:
fmt::print("{:02}", fmt::join(v, ", ")); 
// 输出:01, 02, 03

返回一个视图,使用 sep 分隔范围元素进行格式化。

template <typename It, typename Sentinel>
auto join(It begin, Sentinel end, string_view sep) -> join_view<It, Sentinel>;

返回一个视图,格式化迭代器范围 [begin, end),元素用 sep 分隔。

template <typename T>
auto join(std::initializer_list<T> list, string_view sep) -> join_view<const T*, const T*>;// 输出:"1, 2, 3"
fmt::print("{}", fmt::join({1, 2, 3}, ", "));

返回一个对象,格式化 std::initializer_list,元素用 sep 分隔。

4.2 日期和时间格式化

fmt/chrono.h 为以下类型提供格式化器:

  • std::chrono::duration
  • std::chrono::time_point
  • std::tm

格式语法请参考 Chrono 格式规范。

#include <fmt/chrono.h>int main() {std::time_t t = std::time(nullptr);fmt::print("The date is {:%Y-%m-%d}.", fmt::localtime(t));// 输出:The date is 2020-11-07.// (2020-11-07 为当前日期)using namespace std::literals::chrono_literals;fmt::print("Default format: {} {}\n", 42s, 100ms);// 输出:Default format: 42s 100msfmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s);// 输出:strftime-like format: 03:15:30
}

std::time_t 表示的自 epoch 以来的时间转换为本地时间的日历时间(std::tm)。与 std::localtime 不同,该函数在大多数平台上是线程安全的。

auto localtime(std::time_t time) -> std::tm;

std::time_t 表示的自 epoch 以来的时间转换为协调世界时(UTC)的日历时间(std::tm)。与 std::gmtime 不同,该函数在大多数平台上是线程安全的。

auto gmtime(std::time_t time) -> std::tm;
4.3 终端颜色和文本样式

fmt/color.h 提供终端颜色和文本样式输出支持。

template <typename... T>
void print(const text_style& ts, format_string<T...> fmt, T&&... args);fmt::print(fmt::emphasis::bold | fg(fmt::color::red),"Elapsed time: {0:.2f} seconds", 1.23);

使用 ANSI 转义序列指定文本格式,格式化字符串并打印到标准输出(stdout)。

auto fg(detail::color_type foreground) -> text_style;

从前景色(文本颜色)创建文本样式。

auto bg(detail::color_type background) -⁠> text_style;

从背景色创建文本样式。

template <typename T>
auto styled(const T& value, text_style ts) -> detail::styled_arg<remove_cvref_t<T>>;

返回一个使用 ANSI 转义序列格式化的参数,用于格式化函数。

fmt::print("Elapsed time: {0:.2f} seconds",fmt::styled(1.23, fmt::fg(fmt::color::green) |fmt::bg(fmt::color::blue)));
4.4 动态参数列表

头文件 fmt/args.h 提供了 dynamic_format_arg_store,这是一种类似构建器的 API,用于动态构造格式化参数列表。

template <typename Context>
class dynamic_format_arg_store;

功能:带存储功能的动态格式化参数列表,可隐式转换为 fmt::basic_format_args,用于传递给类型擦除的格式化函数(如 fmt::vformat)。

void push_back(const T& arg);fmt::dynamic_format_arg_store<fmt::format_context> store;
store.push_back(42);          // 整数
store.push_back("abc");        // 字符串(复制存储)
store.push_back(1.5f);         // 浮点数
std::string result = fmt::vformat("{} and {} and {}", store);
// 输出:"42 and abc and 1.5"

作用:向动态存储中添加参数,供后续格式化函数使用。

注意:自定义类型和字符串类型(非字符串视图)会被复制到存储中,必要时动态分配内存。

void push_back(std::reference_wrapper<T> arg);fmt::dynamic_format_arg_store<fmt::format_context> store;
char band[] = "Rolling Stones";
store.push_back(std::cref(band)); // 存储引用
band[9] = 'c';                    // 修改原始数组
std::string result = fmt::vformat("{}", store);
// 输出:"Rolling Scones"(引用值随原始数据变化)

作用:向动态存储中添加参数的引用(避免复制)。

void push_back(const detail::named_arg<char_type, T>& arg);

作用:添加命名参数(支持 std::reference_wrapper 避免参数复制,但名称始终会被复制到存储中)。

void clear();

作用:清空存储中的所有参数。

void reserve(size_t new_cap, size_t new_cap_named);

作用:预留存储空间,至少容纳 new_cap 个参数(包括 new_cap_named 个命名参数)。

size_t size();

作用:返回存储中的参数数量。

相关文章:

C++之fmt库介绍和使用(2)

C之fmt库介绍与使用(2) Author: Once Day Date: 2025年5月19日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...

Python的collections模块:数据结构的百宝箱

Python的collections模块&#xff1a;数据结构的百宝箱 对话实录 小白&#xff1a;处理数据时&#xff0c;Python自带的数据结构不够用&#xff0c;有更强大的工具吗&#xff1f; 专家&#xff1a;那可不能错过collections模块&#xff0c;它提供了许多高效实用的数据结构&am…...

吃透 Golang 基础:数据结构之数组

文章目录 吃透 Golang 基础&#xff1a;数据结构之数组概述初始化访问和赋值小结参考资料 吃透 Golang 基础&#xff1a;数据结构之数组 对于 Golang 当中的顺序数据结构&#xff0c;使用频率最高的当然是切片&#xff0c;因为切片非常的灵活。与之相对比&#xff0c;数组常常会…...

第三个小程序动工:一款结合ai的菜谱小程序

1.环境搭建&#xff0c;与初步运行 安装及使用 | Taro 文档 找到一个合适的文件夹&#xff0c;cmd D:\gitee>pnpm install -g tarojs/cli╭──────────────────────────────────────────╮│ …...

小程序涉及提供提供文本深度合成技术,请补充选择:深度合成-AI问答类目

一、问题描述 最近新项目AI咨询小程序审核上线&#xff0c;按照之前小程序的流程&#xff0c;之前审核&#xff0c;提示审核不通过&#xff0c;审核不通过的原因&#xff1a;小程序涉及提供提供文本深度合成技术 (如: AI问答) 等相关服务&#xff0c;请补充选择&#xff1a;深…...

数据结构测试模拟题(1)

1、约瑟夫问题 #include<bits/stdc.h> using namespace std; const int N25; int e[N],ne[N],head-1,idx1; int n,m; void add_to_head(int x){e[idx]x;ne[idx]head;headidx; } void add(int k,int x){e[idx]x;ne[idx]ne[k];ne[k]idx; } int main(){cin>>n>>…...

Elasticsearch高级面试题汇总及答案

Elasticsearch高级面试题汇总及答案 这套Elasticsearch面试题汇总大全,希望对大家有帮助哈~ 1、什么是Elasticsearch Analyzer? 分析器用于文本分析,它可以是内置分析器也可以是自定义分析器。 2、Elasticsearch 支持哪些配置管理工具? 1、 Ansible 2、 Chef 3、 Pu…...

界面控件DevExpress WinForms v24.2——PDF Viewer功能升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…...

Apache Apisix配置ip-restriction插件以限制IP地址访问

介绍 ip-restriction 插件可以通过将 IP 地址列入白名单或黑名单来限制对服务或路由的访问。 支持对单个 IP 地址、多个 IP 地址和类似 10.10.10.0/24 的 CIDR&#xff08;无类别域间路由&#xff09;范围的限制。 属性 参数名类型必选项默认值有效值描述whitelistarray[st…...

Maven 项目打包时添加本地 Jar 包

在 Maven 项目开发中&#xff0c;我们经常会遇到需要引入本地 Jar 包的场景&#xff0c;比如使用未发布到中央仓库的第三方库、公司内部自定义工具包&#xff0c;或者处理版本冲突的依赖项。本文将详细介绍如何通过 Maven 命令将本地 Jar 包安装到本地仓库&#xff0c;并在项目…...

JavaScript 性能优化:调优策略与工具使用

引言 在当今的 Web 开发领域&#xff0c;性能优化已不再是锦上添花&#xff0c;而是产品成功的关键因素。据 Google 研究表明&#xff0c;页面加载时间每增加 3 秒&#xff0c;跳出率将提高 32%。而移动端用户如果页面加载超过 3 秒&#xff0c;有 53% 的用户会放弃访问。性能…...

48、c# 中 IList 接⼝与List的区别是什么?

在 C# 中&#xff0c;IList 接口和 List 类在集合操作中扮演不同角色&#xff0c;主要区别体现在定义、功能、灵活性、性能及适用场景等方面。以下是详细对比&#xff1a; 1. 定义与本质 IList 接口 抽象契约&#xff1a;仅定义集合的基本操作&#xff08;如索引访问、添加、…...

在 Azure OpenAI 上使用 Elastic 优化支出和内容审核

作者&#xff1a;来自 Elastic Muthukumar Paramasivam&#xff0c;Bahubali Shetti 及 Daniela Tzvetkova 我们为 Azure OpenAI 正式发布包添加了更多功能&#xff0c;现在提供内容过滤监控和计费见解的增强&#xff01; 在之前的博客中&#xff0c;我们展示了如何使用 Elasti…...

Redis学习专题(三)主从复制

目录 引言&#xff1a; 1、搭建一主多从 1) 创建/hspredis目录, 并拷贝redis.conf 到 /hspredis 2) vi /hspredis/redis.conf , 进行如下设置 3) 创建3个文件/hspredis/redis6379.conf 、/hspredis/redis6380.conf 、/hspredis/redis6381.conf 并编辑 4) 启动三台redis服…...

设计模式之备忘录模式

在日常开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;需要保存对象的某个历史状态&#xff0c;以便将来恢复。这种需求最常见的例子就是“撤销操作”。在这种情况下&#xff0c;备忘录模式(Memento Pattern)就派上了用场。 目录 1. 概念 2. 代码实现 3. 总结 1. …...

深度学习-runner.run(data_loaders, cfg.workflow)内部执行过程

文件&#xff1a;~/catkin_ws/SparseDrive/projects/mmdet3d_plugin/apis/mmdet_train.py 完成数据加载器、优化器、运行器实例化后&#xff0c; RUNNERS.register_module() class IterBasedRunner(BaseRunner):"""Iteration-based Runner.This runner train m…...

嵌入式开发学习日志(linux系统编程--文件读写函数)Day24

一、系统编程 标准oi 【输入输出】 stdio.h 头文件 &#xff1a;stdio.h >标准输入输出头文件&#xff1b;/usr/include/stdio.h 二、文件操作 1、关于文件操作的步骤 &#xff08;1&#xff09;打开文件&#xff1b; &#xff08;2&#xff09;io操作&#xff0c;读写…...

DEBUG:Lombok 失效

DEBUG&#xff1a;Lombok 失效 问题描述 基于 Spring Boot 的项目中&#xff0c;编译时显示找不到 log 属性。查看对应的 class 类&#xff0c;Lombok 正常在编译时生成 log 属性。 同时存在另一个问题&#xff0c;使用Getter注解&#xff0c;但实际使用中该注解并没有生效&…...

Qt 控件发展历程 + 目标(1)

文章目录 声明简述控件的发展历程学习目标QWidget属性 简介&#xff1a;这篇文章只是一个引子&#xff0c;介绍一点与控件相关的但不重要的内容&#xff08;浏览浏览即可&#xff09;&#xff0c;这一章节最为重要的还是要把之后常用且重要的控件属性和作用给学透&#xff0c;学…...

按键精灵ios/安卓辅助工具高级函数OcrEx文字识别(增强版)脚本开发介绍

函数名称 OcrEx文字识别&#xff08;增强版&#xff09; 函数功能 返回指定区域内所有识别到的字符串、左上角坐标、区域宽高、可信度&#xff0c;无需自制字库&#xff0c;识别范围越小&#xff0c;效率越高&#xff0c;结果越准确 注意&#xff1a;安卓版按键APP需在设置…...

零基础入门Selenium自动化测试:自动登录edu邮箱

&#x1f31f; Selenium简单概述一下 Selenium 是一个开源的自动化测试工具&#xff0c;主要用于 Web 应用程序的功能测试。它能够模拟用户操作浏览器的行为&#xff08;如点击按钮、填写表单、导航页面等&#xff09;&#xff0c;应用于前端开发、测试和运维领域。 特点 跨…...

MySQL高频面试八连问(附场景化解析)

文章目录 "为什么订单查询突然变慢了&#xff1f;"——从这个问题开始说起一、索引的生死时速&#xff08;必考题&#xff01;&#xff09;二、事务的"套娃"艺术三、锁机制的相爱相杀四、存储引擎的抉择五、慢查询的破案技巧六、分页的深度优化七、高可用架…...

JVM 性能问题排查实战10连击

&#x1f5c2;️ 目录 前言&#xff1a;理论掌握只是起点&#xff0c;定位能力才是核心全局排查模型&#xff1a;三步法1️⃣Full GC 频繁触发&#xff1a;老年代压力过大2️⃣ OOM 爆炸&#xff1a;元空间泄漏 or 缓存未清理3️⃣ CPU 飙升却不是 GC&#xff1a;线程阻塞或热方…...

零基础深入解析 ngx_http_session_log_module

一、引言 在传统的 HTTP 日志中&#xff0c;每个请求都会被单独记录&#xff0c;这对于短连接、异步加载等场景非常直观&#xff1b;但在一些需要以“会话”为单位分析用户行为的场景下&#xff0c;如视频点播、多资源并行加载、长轮询等&#xff0c;单个请求日志难以准确反映…...

10.17 LangChain v0.3核心机制解析:从工具调用到生产级优化的实战全指南

LangChain v0.3 技术生态与未来发展 关键词:LangChain 工具调用, 聊天模型集成, @tool 装饰器, ToolMessage 管理, 多模态交互 使用聊天模型实现工具调用 LangChain v0.3 通过 工具调用(Tool Calling) 机制,将大模型与外部工具深度结合,形成闭环能力链。本节以 GPT-4、L…...

Android Framework学习七:Handler、Looper、Message

文章目录 简介LooperMessageMessageQueueHandlerFramework学习系列文章 简介 Looper当做一台传送装置&#xff0c;MessageQueue是传送带&#xff0c;传送带上放的是Message&#xff0c;Handler用于发送Message分发与接收处理。 Looper frameworks/base/core/java/android/app…...

分钟级降水预报API:精准预测每一滴雨的智慧科技

引言&#xff1a;天气预报进入"分钟时代" 在数字化生活高度发达的今天&#xff0c;人们对天气预报的精确度要求越来越高。传统的24小时预报或小时级预报已无法满足出行、物流、户外活动等场景的精细化需求。分钟级降水预报API的出现&#xff0c;标志着气象服务正式进…...

民政部等部门针对老人权益保障工作发布指导意见

​ 1 品牌资讯 佛慈制药&#xff1a;将探索开发特医食品等产品 李子园将丰富大健康产品矩阵适应银发族需求 京东健康2025年第一季度收入166.45亿元 宁美浩维获融资&#xff0c;致力提供健康管理方案 2 行业动态 固生堂合作华为&#xff0c;联合推动中医药智慧化转型 怡…...

LinkedList源码分析

1. LinkedList初始化 public class LinkedListTest {public static void main(String[] args) {LinkedList<String> list new LinkedList<String>();// 新增list.add("a");list.add("b");list.add("c");list.add("d");l…...

OpenAI Codex 加入Agent编程工具新阵营

上周五&#xff0c;OpenAI推出了一款名为Codex的新型编程系统&#xff0c;该系统能够通过自然语言命令执行复杂的编程任务。Codex标志着OpenAI正式进军正在形成的代理编程工具新阵营。 从GitHub早期的Copilot到当代的Cursor和Windsurf等工具&#xff0c;大多数AI编程助手都是作…...

AMBA三种总线详解并比较

AMBA三种总线详解并比较 AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;是 ARM 公司推出的片上总线标准&#xff0c;旨在为 SoC&#xff08;片上系统&#xff09;提供高效、灵活的通信架构。 一、总线详解 1. AHB&#xff08;Advanced High-perform…...

国产视频转换LT6211UX:HDMI2.0转LVDS/MIPI芯片简介,支持4K60Hz

1. LT6211UX HDMI2.0信号输入 支持HDMI2.0b, HDMI1.4和DVI1.0 支持HDCP2.2和HDCP1.4 数据速率高达6Gbps 自适应接收机均衡 支持4k60Hz 支持的3D格式&#xff1a; 对于HDMI -> LVDS&#xff1a; 直接3D输出 2路2D L/R输出 对于HDMI -> MIPI&#xff1a; 框架包装&#x…...

在nextjs项目当中使用wagmi连接MetaMask SDK

Wagmi 是一个为以太坊和 EVM 兼容链构建的 React Hooks 库,专为简化 Web3 应用开发而设计。它提供了一组强大且类型安全的工具,使开发者能够更方便地与钱包(如 MetaMask、WalletConnect 等)和智能合约进行交互。 Wagmi 的全称其实并不是一个传统意义上的缩写,它源自加密社…...

SAP-ABAP:SAP的`TRY...CATCH` 异常处理机制详解

一、异常处理架构与核心机制 1. 异常分类与层次结构 异常类型触发机制处理要求典型子类CX_STATIC_CHECK编译器强制检查(必须声明或捕获)必须显式处理CX_SY_ZERODIVIDE(除零错误)CX_DYNAMIC_CHECK运行时检查(若未处理则触发运行时错误RESUMABLE_FAILURE)推荐显式处理CX_S…...

HarmonyOS NEXT~鸿蒙系统与Uniapp跨平台开发实践指南

HarmonyOS NEXT&#xff5e;鸿蒙系统与Uniapp跨平台开发实践指南 引言&#xff1a;鸿蒙与Uniapp的融合价值 华为鸿蒙系统(HarmonyOS)作为新一代智能终端操作系统&#xff0c;其分布式能力与跨设备协同特性为开发者带来了全新机遇。而Uniapp作为流行的跨平台应用开发框架&…...

python 提交命令 到远程windows中

在Python中&#xff0c;你可以使用多种方式来提交命令到远程Windows机器上。最常见的方法是通过SSH协议&#xff08;使用paramiko库&#xff09;或者通过Windows远程管理工具如WinRM&#xff08;使用python-winrm库&#xff09;。 使用Paramiko进行SSH连接 Paramiko是一个Pyth…...

【520 特辑】用 HTML/CSS/JavaScript 打造浪漫炫酷的表白网页

一、前言 在 520 这个充满爱意的日子里&#xff0c;程序员该如何用代码表达浪漫&#xff1f;本文将分享一个结合动画特效与交互设计的 520 表白网页案例&#xff0c;通过 HTML/CSS/JavaScript 实现动态爱心、渐变背景、浮动文字等炫酷效果&#xff0c;手把手教你用技术传递心意…...

【QT】QTableWidget获取width为100,与真实值不符问题解决

背景 用stackedWidget内嵌2个QTableWidget页面&#xff0c;实现切换。在进行stackedWidget.width()的获取时候&#xff0c;可以正常获得ui界面设置的宽度值&#xff0c;但是在QTableWidget页面用同样的方式无法成功获取真实值&#xff0c;即使采用获取内容区域宽度&#xff08…...

Hive drop column 的解决方法

示例&#xff1a; 创建 text 格式的表 create table t1(c1 int, c2 int) stored as textfile;增加一个字段 alter table t1 add columns (c3 int);使用 replace columns 删除新加的字段 alter table t1 replace columns (c1 int, c2 int);对于 ORC 类型的表&#xff0c;使用…...

Python虚拟环境再PyCharm中自由切换使用方法

Python开发中的环境隔离是必不可少的步骤,通过使用虚拟环境可以有效地管理不同项目间的依赖,避免包冲突和环境污染。虚拟环境是Python官方提供的一种独立运行环境,每个项目可以拥有自己单独的环境,不同项目之间的环境互不影响。在日常开发中,结合PyCharm这样强大的IDE进行…...

Spark大数据分析案例(pycharm)

所需文件&#xff08;将文件放在路径下&#xff0c;自己记住后面要用&#xff09;&#xff1a; 通过百度网盘分享的文件&#xff1a;beauty_p....csv等4个文件 链接&#xff1a;https://pan.baidu.com/s/1pBAus1yRgefveOc7NXRD-g?pwd22dj 提取码&#xff1a;22dj 复制这段内…...

【QT】ModbusTCP读写寄存器类封装

背景 在编写ModbusTCP时候&#xff0c;连接、寄存器读写属于通用的功能&#xff0c;为了便于后续直接复用&#xff0c;选择封装到一个类。本博文在封装展示该类过程中&#xff0c;会提及到编写该类过程中&#xff0c;出现的连接未成功的问题&#xff0c;以及该问题的解决方式。…...

SQLMesh 内置宏详解:@PIVOT等常用宏的核心用法与示例

本文系统解析 SQLMesh 的四个核心内置宏&#xff0c;涵盖行列转换的 PIVOT、精准去重的 DEDUPLICATE、灵活生成日期范围的 DATE_SPINE&#xff0c;以及动态表路径解析的 RESOLVE_TEMPLATE。通过真实案例演示参数配置与 SQL 渲染逻辑&#xff0c;并对比宏调用与传统 SQL 的差异&…...

ajax post请求 解决自动再get请求一次

ajax post请求 解决自动再get请求一次 HTMLjavascriptFlask第一种方法&#xff1a;第二种方法&#xff1a; HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title></head> &l…...

当前主流的传输技术(如OTN、IP-RAN、FlexE等)

好的&#xff01;当前主流的传输技术&#xff08;如OTN、IP-RAN、FlexE等&#xff09;各有其独特的应用场景&#xff0c;下面我会逐一展开讲解&#xff0c;并结合实际案例说明它们如何在不同领域发挥作用。 一、OTN&#xff08;光传送网&#xff09; 1. 核心特点 大容量&…...

利用 SQL Server 作业实现异步任务处理,简化系统架构

在现代企业系统中&#xff0c;异步任务是不可或缺的组成部分&#xff0c;例如&#xff1a; 电商系统中的订单超时取消&#xff1b; 报表系统中的异步数据导出&#xff1b; CRM 系统中的客户积分计算。 传统的实现方式通常涉及引入消息队列&#xff08;如 RabbitMQ、Kafka&a…...

【Java高阶面经】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战

一、熔断抖动的本质剖析与核心成因 1.1 熔断机制的核心价值与抖动危害 熔断机制作为微服务弹性架构的核心组件,通过模拟电路断路器逻辑,在服务出现异常时自动阻断请求链,防止故障扩散引发雪崩。但频繁的“熔断-恢复-熔断”抖动会导致: 用户体验恶化:请求成功率波动大,响…...

如何删除 HP 笔记本电脑中的所有数据:3 种解决方案说明

当您准备删除 HP 笔记本电脑中的所有数据时&#xff0c;无论是为了保护您的隐私还是为设备重新启动做好准备&#xff0c;使用正确的方法非常重要。在本文中&#xff0c;您可以获得 3 个有效的解决方案&#xff0c;帮助您轻松删除计算机中的所有内容。之后&#xff0c;您可以安全…...

以太联 - Intellinet 闪耀台北 SecuTech 国际安全科技应用博览会

2025 年 5 月 7 日至 9 日&#xff0c;台北 SecuTech 国际安全科技应用博览会现场热闹非凡&#xff0c;以太联 - Intellinet 携旗下前沿产品与解决方案精彩亮相&#xff0c;成为展会上一道亮丽的风景线&#xff0c;吸引了众多业内人士的目光&#xff0c;收获了广泛关注与高度认…...

JavaScript性能优化实战(13):性能测试与持续优化

在前面的系列文章中,我们探讨了各种JavaScript性能优化的方法和实战案例。然而,优化工作不应仅是一次性的努力,而应当成为开发流程中的常态。本篇将聚焦于如何建立系统化的性能测试体系,并实现持续的性能优化机制,确保应用长期保持出色的性能表现。 前端性能测试体系构建…...