C 进阶 — 程序环境和预处理
C 进阶 — 程序环境和预处理
主要内容
程序的编译和执行环境
C 程序编译和链接
预定义符号
预处理指令 #define
预处理指令 #include
预处理指令 #undef
预处理操作符 # 和 ##
宏和函数对比
命令行定义
条件编译
一 程序的编译和执行环境
ANSI C 存在两个不同环境
1、编译环境,将源代码转换为可执行的机器指令
2、执行环境,实际执行代码
二 C 程序编译和链接
2.1 编译
程序的每个源文件通过编译过程转换为目标文件(object code),并由链接器(linker)捆绑在一起,形成一个完整的可执行程序
链接器会引入程序用到的 C 库函数,及个人函数库,将所需函数链接到程序中
查看编译过程
#include <stdio.h>
int main()
{int i = 0;for(i=0; i<10; i++){printf("%d ", i);}return 0;
}
1、预处理 gcc -E print_arr.c -o print_arr.i
预处理完成后停止,结果保存在 print_arr.i
文件中
2、编译 gcc -S print_arr.c
编译完成后停止,结果保存在 print_arr.s
中
3、汇编 gcc -c print_arr.c
汇编完成后停止,结果保存在 print_arr.o
中
示例代码
//sum.c
int g_val = 2016;
void print(const char *str)
{printf("%s\n", str);
}//test.c
#include <stdio.h>
int main()
{extern void print(char *str);extern int g_val;printf("%d\n", g_val);print("hello bit.\n");return 0;
}
2.2 运行环境
程序执行过程
1、程序必须载入内存中,在有操作系统的环境中,一般由操作系统完成。在独立环境中,程序载入通过可执行代码置入只读内存完成
2、程序开始执行,调用 main 函数
3、执行程序代码,程序使用一个运行栈(stack),存储函数局部变量和返回地址。也可使用静态(static)内存,存储于静态内存中的变量生命周期是整个程序的执行过程
4、终止程序,main 函数正常终止,或意外终止
三 预处理
3.1 预定义符号
__FILE__ //编译的源文件名
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循 ANSI C, 其值为 1,否则未定义
预定义符号是语言内置的,如下例
printf("FILE %s LINE %d\n", __FILE__, __LINE__);
3.2 #define
3.2.1 #define 定义标识符
//语法:
#define name stuff
#define MAX 1000
#define reg register //为 register 关键字, 创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case //写 case 语句时自动把 break 补上// 如果定义的 stuff 过长, 可分成几行写, 除最后一行外, 每行后面加一个反斜杠 ( 续行符 )
#define DEBUG_PRINT printf("FILE:%s\tLINE:%d\t \date:%s\ttime:%s\n" ,\__FILE__,__LINE__ , \__DATE__,__TIME__ )
在 define 定义标识符时,能不能在最后加上 ;
如下例
#define MAX 1000;
#define MAX 1000//建议不要加上 ; 容易导致问题, 比如下面场景
if(condition)max = MAX;
elsemax = 0;
3.2.2 #define定义宏
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)
//语法
#define name( parament-list ) stuff
// parament-list 是一个由逗号隔开的符号表,它们可能出现在 stuff 中
注意 参数列表左括号必须与 name 紧邻,两者间有任何空白存在,参数列表就会被解释为 stuff 的一部分
宏示例
#define SQUARE(x) x * xint a = 5;
printf("%d\n" ,SQUARE( a + 1) ); //打印 11
预处理器文本替换时,参数 x 被替换成 a + 1,所以上述语句实际上变成了 printf ("%d\n",a + 1 * a + 1 );
#define SQUARE(x) (x) * (x)int a = 5;
printf("%d\n" ,10 * DOUBLE(a)); //打印 55
替换后 printf ("%d\n",10 * (5) + (5));
因此 #define DOUBLE( x) ( ( x ) + ( x ) )
总结:用于对数值表达式进行求值的宏定义,都应该用上述方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符间不可预料的相互作用
3.2.3 #define 替换规则
#define 定义符号和宏时涉及几个步骤
1、在调用宏时,首先对参数检查,是否包含任何由 #define 定义的符号,如果是它们首先被替换
2、替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被它们的值所替换
3、再次对结果文件进行扫描,看它是否包含任何由 #define 定义的符号,如果是则重复上述过程
注意:
1、宏参数和 #define 定义中可以出现其它 #define 定义的符号,但宏不能递归
2、预处理器搜索 #define 定义的符号时,字符串常量内容并不被搜索
3.2.4 # 和
如何把参数插入到字符串中 ?
char* p = "Hello ""World\n";
printf("Hello"" World\n"); //输出 Hello World
printf("%s", p); //输出 Hello World
字符串有自动连接的特点
#define PRINT(FORMAT, VALUE)\printf("the value is "FORMAT"\n", VALUE);
...
PRINT("%d", 10);
//这里只有当字符串作为宏参数时, 才可以把字符串放在字符串中
使用 # 把一个宏参数变成对应的字符串
int i = 10;
#define PRINT(FORMAT, VALUE)\printf("the value of " #VALUE "is "FORMAT "\n", VALUE);
...
PRINT("%d", i+3); //the value of i+3 is 13
代码中的 #VALUE
会预处理器处理为 "VALUE"
## 的作用
## 可以把位于它两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符
#define ADD_TO_SUM(num, value) \sum##num += value;
...
int sum5 = 0;
ADD_TO_SUM(5, 10); //作用是:给 sum5 增加 10
注:连接结果必须是合法标识符,否则结果是未定义的
3.2.5 带副作用的宏参数
当宏参数在宏定义中出现超过一次的时候,如果参数带有副作用,那么在使用宏时就可能出现不可预测的后果(副作用指表达式求值时出现的永久性效果)
x+1; //不带副作用
x++; //带有副作用#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
...
x = 5;
y = 8;
z = MAX(x++, y++);
printf("x=%d y=%d z=%d\n", x, y, z);//z = ( (x++) > (y++) ? (x++) : (y++));
//x=6 y=10 z=9
3.2.6 宏和函数对比
宏通常被应用于执行简单的运算,比如在两个数中找出较大的一个
#define MAX(a, b) ((a)>(b)?(a):(b))
为什么不使用用函数
1、调用函数有开销,宏比函数效率更高
2、函数参数必须声明特定类型,宏是类型无关的
宏的缺点
1、除非宏比较短,否则可能大幅度增加程序长度
2、宏没法调试
3、宏由于类型无关,不够严谨
4、宏可能会带来运算符优先级问题
宏有时可以做函数做不到的事,比如:宏参数可以使用类型,但函数不行
#define MALLOC(num, type)\(type *)malloc(num * sizeof(type))
...
//使用
MALLOC(10, int);//类型作为参数
//预处理器替换之后:
(int *)malloc(10 * sizeof(int));
宏和函数的对比
一般的命名约定
宏名全部大写
函数名不要全部大写
3.3 #undef
//该指令用于移除一个宏定义
#undef NAME
//如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除
3.4 命令行定义
许多 C 编译器允许在命令行中定义符号,用于启动编译过程
例如:当同一个源文件要编译出一个程序的不同版本时(假定某程序中声明了一个某长度数组,如果机器内存有限,需要一个很小数组,但是另外一个机器内存大些,需要一个数组能够大些)
#include <stdio.h>
int main()
{int array [ARRAY_SIZE];int i = 0;for(i = 0; i< ARRAY_SIZE; i ++){array[i] = i;}for(i = 0; i< ARRAY_SIZE; i ++){printf("%d " ,array[i]);}printf("\n" );return 0;
}
编译指令
gcc -D ARRAY_SIZE=10 programe.c
3.5 条件编译
条件编译,在编译程序时将一条语句(一组语句)编译或者放弃编译
#include <stdio.h>
#define __DEBUG__
int main()
{int i = 0;int arr[10] = {0};for(i=0; i<10; i++){arr[i] = i;#ifdef __DEBUG__printf("%d\n", arr[i]); //观察数组是否赋值成功 #endif //__DEBUG__}return 0;
}
常见的条件编译指令
//1.
#if 常量表达式//...
#endif
//常量表达式由预处理器求值
如:
#define __DEBUG__ 1
#if __DEBUG__//..
#endif//2.多个分支的条件编译
#if 常量表达式//...
#elif 常量表达式//...
#else//...
#endif//3.判断是否被定义
#if defined(symbol)
#ifdef symbol#if !defined(symbol)
#ifndef symbol//4.嵌套指令
#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif
#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif
#endif
3.6 文件包含
#include 指令可以使另外一个文件被编译,就像它实际出现于 #include 指令的地方一样
替换的方式:
- 预处理器先删除这条指令,并用包含文件的内容替换
- 这样一个源文件被包含 10 次,那就实际被编译 10 次
3.6.1 头文件被包含的方式
本地文件包含
#include "filename"
查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件,如果找不到就提示编译错误
//Linux 环境标准头文件路径
/usr/include//VS2013 环境标准头文件路径
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
库文件包含
#include <filename.h>
查找头文件直接去标准路径下去查找,如果找不到就提示编译错误
3.6.2 嵌套文件包含
如下图 comm.h
和 comm.c
是公共模块。test1.h
和 test1.c
使用了公共模块,test2.h
和 test2.c
使用了公共模块,test.h
和 test.c
使用了 test1
模块和 test2
模块。这样最终程序中就会出现两份 comm.h
内容,造成了文件内容重复
使用条件编译解决上述问题
每个头文件的开头写
#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif //__TEST_H__
或者
#pragma once
避免头文件的重复引入
四 其他预处理指令
#error
#pragma
#line
可参考《C语言深度解剖》学习
相关文章:
C 进阶 — 程序环境和预处理
C 进阶 — 程序环境和预处理 主要内容 程序的编译和执行环境 C 程序编译和链接 预定义符号 预处理指令 #define 预处理指令 #include 预处理指令 #undef 预处理操作符 # 和 ## 宏和函数对比 命令行定义 条件编译 一 程序的编译和执行环境 ANSI C 存在两个不同环境…...
基于单片机的温湿度采集系统(论文+源码)
2.1系统的功能 本系统的研制主要包括以下几项功能: (1)温度检测功能:对所处环境的温度进行检测; (2)湿度检测功能:对所处环境的湿度进行检测; (3)加热和制冷功能:可以完成加热和制冷功能。 (4)加湿和除…...
【数据分析处理之缺失值】
文章目录 一、缺失值的影响1. 统计分析的偏差2. 机器学习模型的性能下降3. 数据质量和可信度下降4. 数据利用率降低5. 增加数据预处理的复杂度 二、识别缺失值1. 使用工具识别缺失值2. 可视化缺失数据 三、处理缺失值的策略1. 删除含缺失值的行或列2. 填充缺失值a. 用常数填充b…...
【大模型实战篇】Mac本地部署RAGFlow的踩坑史
1. 题外话 最近一篇文章还是在11月30日写的,好长时间没有打卡了。最近工作上的事情特别多,主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed,后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…...
SQL Server实现将分组的其他字段数据拼接成一条数据
在 SQL Server 中,可以使用 STRING_AGG 函数(SQL Server 2017 及更高版本支持)将分组的其他字段数据拼接成一条数据。以下是示例代码: 假设有一个表 Orders,结构如下: OrderIDCustomerIDProduct1C001Appl…...
STM32 高级 物联网通讯之蓝牙通讯
目录 蓝牙基础知识 蓝牙概述 蓝牙产生背景 蓝牙发展历程 蓝牙技术类型 经典蓝牙(BR/EDR和AMP) 低功耗蓝牙(BLE) 市场上常见蓝牙架构 SOC蓝牙单芯片方案 SOC蓝牙+MCU方案 蓝牙host+controller分开方案 蓝牙协议栈 蓝牙芯片架构 BLE低功耗蓝牙协议栈框架 物理…...
堆排序基础与实践:如何在Java中实现堆排序
目录 一、堆排序的基本原理 二、堆排序的实现步骤 三、堆排序的时间复杂度和空间复杂度 四、堆排序的工作流程 五、堆排序的优缺点 六、堆排序的应用场景 堆排序(Heap Sort)是一种基于堆数据结构的排序算法。堆是一种特殊的完全二叉树,…...
你有哪些Deep Learning(RNN、CNN)调参的经验?
在深度学习的实践中,调参是一项既艺术又科学的工作。它不仅需要理论知识的支撑,还需要大量的实践经验。以下是一些在RNN和CNN模型调参中积累的经验,希望对正在这个领域摸索的朋友们有所帮助。 1. 从成熟的开源项目开始 对于初学者来说&…...
小程序租赁系统开发的优势与应用探索
内容概要 在如今这个数码科技飞速发展的时代,小程序租赁系统开发仿佛是一张神奇的魔法卡,能让租赁体验变得顺畅如丝。想象一下,无论你需要租用什么,从单车到房屋,甚至是派对用品,只需动动手指,…...
Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化
如何使用 Maven 将 Spring Boot 应用程序 Docker 化? Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring B…...
Day58 图论part08
拓扑排序精讲 拓扑排序看上去很复杂,其实了解其原理之后,代码不难 代码随想录 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();List<List<Integer&…...
u3d中JSON数据处理
一.认识JSON 1.1 Json概述 JSON(JavaScript Object Notation,JavaScript对象表示法)JSON和XML是比较类似的技术,都是用来存储文本信息数据的;相对而言,JSON比XML体积更小巧,但是易读性不如XML…...
大语言模型(LLM)一般训练过程
大语言模型(LLM)一般训练过程 数据收集与预处理 收集:从多种来源收集海量文本数据,如互联网的新闻文章、博客、论坛,以及书籍、学术论文、社交媒体等,以涵盖丰富的语言表达和知识领域。例如,训练一个通用型的LLM时,可能会收集数十亿甚至上百亿字的文本数据.清洗:去除…...
第十六届蓝桥杯模拟赛(第一期)(C语言)
判断质因数 如果一个数p是个质数,同时又是整数a的约数,则p称为a的一个质因数。 请问2024有多少个质因数。 了解 约数,又称因数。整数a整除整数b,b为a的因数(约数)质数,又称素数。只有1和它本身两…...
某网站手势验证码识别深入浅出(全流程)
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/20 本篇文章包含经验和教训总结,我采用了两种方法进行识别,两种方法都各有优劣,其中一…...
QT---------QT框架功能概述
常用Qt界面组件 Qt提供了丰富的界面组件,如QPushButton(按钮)、QLineEdit(单行文本框)、QTextEdit(多行文本框)、QLabel(标签)、QComboBox(下拉框࿰…...
C++ 设计模式:模板方法(Template Method)
链接:C 设计模式 链接:C 设计模式 - 策略模式 链接:C 设计模式 - 观察者模式 模板方法(Template Method)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。通过这…...
下载mysql免安装版和配置
1、下载地址 点击去官网下载https://downloads.mysql.com/archives/community/ 2、解压安装mysql 解压的文件夹是没有my.ini文件和data目录,需要我们自己去创建 根目录下创建my.ini,根目录创建data [mysql] default-character-setutf8[mysqld] #端口 po…...
Web服务端技术原理及应用
前言 黄色的是考点,蓝色的是重点。 HTML/CSS/JS 本章会有一个7分的程序设计题,用到前端知识 form表单元素,常用表单元素 html:HTML快速上手 基础语法、css常用选择器(ID、类)、盒子模型 css:网页美化指南 JS …...
数据库的使用09:使用SSMS工具将SQLsever数据导出到Excel
第一步,新建一个空白的.csv文件 第二步,按步骤点击导出 第三步,选择数据源(Db数据库) 第四步,选择目标源(CSV平面文件目标) 第五步,指定表或SQL 一直点下一步即可&am…...
Python中__getitem__ 魔法方法
在Python中,__getitem__ 是一个特殊的方法,通常称为“魔法方法”或“双下方法”(因为它们的名字前后都有两个下划线)。__getitem__ 方法允许一个对象实现像序列(如列表、元组、字符串)一样的行为࿰…...
自动驾驶三维重建
大概八成估计是未来的科研方向了 Neural Radiance Field in Autonomous Driving: A Survey...
小程序中引入echarts(保姆级教程)
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN这四个怎么在gorm中使用
在 GORM 中,JOIN 操作是通过 Joins 方法实现的,而不同类型的 JOIN(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN)可以通过特定的 SQL 语法来表示。GORM 本身并没有直接的 INNER, LEFT, RIGHT 等专用方法,但可以…...
分布式版本管理工具——Git关联远程仓库(github+gitee)
Git远程仓库(Github)的基本使用 一、前言二、Git远程仓库介绍三、演示1. 关联github远程仓库2. 关联gitee(码云)远程仓库3. 重命名远程仓库名4. 移除远程仓库 四、结束语 一、前言 古之立大事者,不惟有超世之才&#x…...
复习打卡大数据篇——HIVE 01
目录 1. 数据仓库初识 1.1 数据仓库概念 1.2 数据仓库特点 1.3 OLTP、OLAP区别 1.4 数仓分层架构 2. HIVE初识 2.1 什么是hive? 2.2 hive架构 3. HIVE初体验 3.1 beeline客户端使用 1. 数据仓库初识 1.1 数据仓库概念 数据仓库,Data WareHou…...
第430场周赛:使每一列严格递增的最少操作次数、从盒子中找出字典序最大的字符串 Ⅰ、统计特殊子序列的数目、统计恰好有 K 个相邻元素的数组数目
Q1、使每一列严格递增的最少操作次数 1、题目描述 给你一个由 非负 整数组成的 m x n 矩阵 grid。 在一次操作中,你可以将任意元素 grid[i][j] 的值增加 1。 返回使 grid 的所有列 严格递增 所需的 最少 操作次数。 2、解题思路 逐列处理:我们需要逐…...
前端处理跨域的几种方式
什么是跨域 指一个域下文档或者脚本去请求另一个域下的资源,这里的跨域是广义的; 广义的跨域: 资源提跳转:A链接、重定向、表单提交资源潜入:link、script、img、frame等dom标签,还有样式中background:url(…...
《计算机网络A》单选题-复习题库
1. 计算机网络最突出的优点是(D) A、存储容量大B、将计算机技术与通信技术相结合C、集中计算D、资源共享 2. RIP 路由协议的最大跳数是(C) A、13B、14C、15D、16 3. 下面哪一个网络层次不属于 TCP/IP 体系模型(D&a…...
网络安全威胁2024年中报告
下载地址: 网络安全威胁2024年中报告-奇安信...
Quartz - JDBC-Based JobStore事务管理及锁机制
由于JDBC-Based JobStore在进行job注册、trigger注册、任务调度及执行过程中需要操作数据库,而且会涉及到多张表,比如trigger注册的时候会根据不同情况写入triggers、simple_triggers或cron_triggers表,在执行任务的时候会读取和更新trigg…...
机器学习作业 | 泰坦尼克号生存的预测任务
泰坦尼克号生存的预测任务 学校作业,我来水一水 环境:pycharmanaconda虚拟环境 文章目录 泰坦尼克号生存的预测任务0.环境搭建参考:1 目的与要求2 任务背景3 任务简介4 模型介绍1.决策树(Decision Tree)2.朴素贝叶斯…...
Tonghttpserver6.0.1.3 使用整理(by lqw)
文章目录 1.声明2.关于单机版控制台和集中管理控制台3.单机版控制台3.1安装,启动和查看授权信息3.2一些常见的使用问题(单机控制台)3.3之前使用的是nginx,现在要配nginx.conf上的配置,在THS上如何配置3.4如何配置密码过…...
图像坐标导数的表达式 Expression for Image Coordinate Derivate
Title: 图像坐标导数的表达式 Expression for Image Coordinate Derivate 文章目录 I. 图像坐标 Image CoordinatesII. 关于 x \mathbf{x} x 的导数 Derivative wrt x \mathbf{x} x1. 第一部分2. 第二部分3. 两部分合并 III. 关于 H H H 的导数 Derivative wrt H H H1. 第一…...
Jenkins 中自动化部署 Spring Boot 项目
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…...
Live555、FFmpeg、GStreamer介绍
Live555、FFmpeg 和 GStreamer 都是处理流媒体和视频数据的强大开源框架和工具,它们广泛应用于实时视频流的推送、接收、处理和播放。每个框架有不同的设计理念、功能特性以及适用场景。下面将详细分析这三个框架的作用、解决的问题、适用场景、优缺点,并…...
西门子DBX DBD DBB DBW的关系
DB10.DBD0 DB10.DBW0DB10.DBW2 DB10.DBB0DB10.DBB1DB10.DBB2DB10.DBB3 DB10.DBX0.00.7DB10.DBX1.01.7DB10.DBX2.02.7DB10.DBX3.03.7 使用之前需要在DB10中先定义,如果你仅在DB10中定义了一个DBD0,那么原则上你是可以使用上述所有地址的,但…...
语言模型在时间序列预测中的作用
语言模型在时间序列预测中的作用 从目前相关的研究情况来看,大语言模型在时间序列预测中的作用存在争议。 质疑其有用性的方面 消融研究结果:在对一些流行的基于语言模型(LLM)的时间序列预测方法进行消融研究时发现,去除LLM组件或将其替换为基本注意力层,在大多数情况下…...
【centos8 镜像修改】centos8 镜像修改阿里云
要将 CentOS 8 的镜像源修改为阿里云镜像,你需要编辑 /etc/yum.repos.d/ 目录下的 .repo 文件。以下是具体的步骤: 备份原始的 .repo 文件: 在编辑之前,建议备份原始的 .repo 文件,以便在出现问题时可以恢复。 sudo cp…...
2024年12月个人工作生活总结
本文为 2024年12月工作生活总结。 研发编码 Golang语言byte数组赋值 假定有如下变量: var strCode string var bCode [9]byte现需将string类型转换成byte类型,如下: bCode []byte(strCode)无法转换,提示: cannot…...
[cg] android studio 无法调试cpp问题
折腾了好久,native cpp库无法调试问题,原因 下面的Deploy 需要选Apk from app bundle!! 另外就是指定Debug type为Dual,并在Symbol Directories 指定native cpp的so路径 UE项目调试: 使用Android Studio调试虚幻引擎Android项目…...
vulnhub靶场【warzone】之2
前言 靶机:warzone-1,IP地址192.168.1.71 攻击:kali,IP地址192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 因为都是同一局域网下,相当于内网环境,所以使用下面的工具,若想…...
MySQL什么情况下会加间隙锁?
目录 一、使用范围条件查询 二、唯一索引的范围查询 三、普通索引的查询 四、间隙锁的锁定规则 五、间隙锁的影响 间隙锁(Gap Lock)是MySQL中的一种锁机制,主要用于防止幻读现象。在MySQL的InnoDB存储引擎中,当事务隔离级别设置为可重复读(Repeatable Read)时,间隙…...
REDIS2.0
string list hash set 无序集合 声明一个key,键里面的值是元素,元素的类型是string 元素的值是唯一的,不能重复 多个集合类型之间可以进行并集,交集,集查的运算 sadd test1 a b c c d :添加5个元素&am…...
Java方法使用详解:从基本概念到进阶技巧
1. 方法介绍 方法是执行特定功能的代码块,可以被多次调用。方法由方法头和方法体组成,方法头包括方法名、参数列表和返回类型。方法体包含实际执行的代码。 2. 无参无返回值方法使用 这种方法没有参数,也不返回任何值。常用于执行一些不需…...
RT-Thread中堆和栈怎么跟单片机内存相联系
现在RT-ThreadMCU的应用方式越来越普遍,RT-Thread需要配置MCU中的RAM到的系统中,进入系统内存管理,才能提供给基于实时系统的应用程序使用,比如给应用程序提供malloc、free等函数调用功能。在嵌入式软件开发中,我们经常…...
对jenkins的rpm进行处理
下载Jenkins RPM包 首先,你需要从Jenkins官方网站(https://pkg.jenkins.io/redhat - stable/)下载合适的RPM包。通常,对于CentOS等基于RPM的系统,可以选择jenkins - <version>.noarch.rpm这种格式的包࿰…...
从Huggingface中下载数据集、模型
报错: 可能原因: 1. 服务器网络连接 这样就显示没有问题 2.访问权限问题 3.连接超时 4.使用镜像 使用镜像的方法在autodl上是可以成功的,但是在一些服务器却不能成功,那么就需要我们下载到本地,然后再把本地的打包…...
设计模式的分类
根据概念性动机分3类设计模式 创建型模式:管理对象的创建。 常用的有单例模式,简单工厂模式,工厂方法模式,另外还有原型模式,抽象工厂模式,建造者模式 结构型模式:将已有对象加入到设计中时…...
【图像去噪】论文精读:DualDn: Dual-domain Denoising via Differentiable ISP
请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言Abstract1 Introduction2 Related W…...