【C语言】头文件
所有学习过C语言的朋友都熟悉这样一段代码:
#include <stdio.h>int main(int argc, char *argv[])
{return 0;
}
那么,你真的了解 <stdio.h>
吗? <stdio.h>
到底是什么呢? <stdio.h>
和 "stdio.h"
这两种写法皆可行吗?为什么?这二者有何区别呢?如果让你自己写一个类似头文件 <stdio.h>
的头文件,你能写出来并在大型项目中四处引用属于自己的头文件吗?
这篇文章像大家详细介绍 C语言中的 头文件: 头文件是一个包含函数声明、宏定义、数据类型定义和全局变量声明的文件,通常配合 .c 源文件使用。头文件通过 #include
指令被引入到源文件中(或其他头文件中)。
头文件的作用:
- 代码复用:将通用的函数、宏、类型等内容放入头文件,可以在多个源文件中共享,避免重复编写。
- 声明与定义分离:头文件中通常只包含声明,而具体的实现代码(定义)放在 .c 文件中,从而实现模块化设计。
- 方便管理:将代码逻辑拆分到不同的头文件和源文件中,可以让项目结构更加清晰,方便维护和扩展。
- 提高代码可读性:头文件可以让程序员快速了解模块的接口和功能,而无需深入查看源文件的具体实现。
头文件的内容
头文件通常包含以下内容:
- 函数声明:在头文件中声明函数的原型,使其他源文件可以调用这些函数。
// math_utils.h
#ifndef __MATH_UTILS_H
#define __MATH_UTILS_H// 函数声明
int add(int a, int b);
int multiply(int a, int b);#endif
- 宏定义:可以在头文件中定义一些宏,用于常量表达式、条件编译或代码优化。
#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))
- 数据类型定义:头文件中可以使用
typedef
定义新的数据类型,也可以定义结构体或枚举。
// 定义新类型
typedef unsigned int uint;// 定义结构体
typedef struct {int x;int y;
} Point;// 定义枚举
typedef enum {RED,GREEN,BLUE
} Color;
- 全局变量声明:在头文件中声明全局变量,但其定义应放在对应的 .c 文件中。
// 头文件中声明全局变量
extern int global_variable;
// 源文件中定义全局变量
int global_variable = 42;
- 内联函数(C99 及以上版本):头文件可以包含内联函数的定义,这种函数通常体积小、性能高,直接在调用处展开。
static inline int square(int x) {return x * x;
}
创建和使用头文件
- 创建头文件
- 创建一个
扩展名为 .h
的文件(如math_utils.h
)。 - 将函数声明、宏定义、数据类型定义等内容写入其中。
- 创建一个
示例头文件:math_utils.h
#ifndef MATH_UTILS_H // 防止重复包含
#define MATH_UTILS_H// 函数声明
int add(int a, int b);
int multiply(int a, int b);// 宏定义
#define PI 3.14159#endif
- 引入头文件
- 在需要使用头文件内容的源文件中,通过
#include
指令引入头文件。
- 在需要使用头文件内容的源文件中,通过
#include "math_utils.h" // 自定义头文件
#include <stdio.h> // 标准头文件int main() {int result = add(3, 5);printf("3 + 5 = %d\n", result);return 0;
}
- 定义对应的实现文件
- 头文件提供的是声明,而具体的实现需要在对应的 .c 文件中定义。
math_utils.c 文件:
#include "math_utils.h"int add(int a, int b) {return a + b;
}int multiply(int a, int b) {return a * b;
}
- 编译与链接
- 编译时,需要将头文件的 .c 文件与主程序一起编译并链接:
gcc main.c math_utils.c -o program
标准头文件
C 标准库提供了一系列常用的头文件,包含许多函数和宏,方便程序开发。以下是一些常见的标准头文件:
头文件 | 描述 |
---|---|
<stdio.h> | 标准输入输出(如 printf、scanf) |
<stdlib.h> | 通用工具(如内存分配、随机数生成) |
<string.h> | 字符串操作(如 strcpy、strlen) |
<math.h> | 数学函数(如 sin、sqrt) |
<time.h> | 时间和日期操作 |
<ctype.h> | 字符处理(如 isalpha、isdigit) |
<limits.h> | 各种数据类型的限制 |
<float.h> | 浮点数特性 |
<assert.h> | 断言 |
<stddef.h> | 定义标准类型(如 size_t、NULL) |
<stdint.h> | 定义精确宽度的整数类型(如 int32_t) |
<errno.h> | 错误代码 |
示例:使用 <math.h> 中的函数
#include <stdio.h>
#include <math.h>int main() {double result = sqrt(16.0); // 平方根printf("Square root of 16 = %.2f\n", result);return 0;
}
防止头文件重复包含
在大型项目中,头文件可能会被多次包含,导致重复定义错误。为避免这种问题,头文件通常使用头文件保护机制:
- 宏保护
通过条件编译指令 #ifndef
和 #define
实现头文件保护。
#ifndef HEADER_FILE_NAME_H
#define HEADER_FILE_NAME_H// 头文件内容#endif
- #pragma once(非标准但常用)
使用 #pragma once
指令也是一种防止重复包含的方式,且更简洁。
#pragma once// 头文件内容
头文件的常见问题
- 重复包含问题
当头文件没有使用保护机制时,可能会导致重复定义错误。
解决方法: ① 使用 #ifndef
和 #define
宏保护。② 或者使用 #pragma once
。
- 头文件与实现文件不匹配
如果头文件中声明的函数没有在实现文件中定义,或者函数签名不一致,可能会导致编译错误或运行时错误。
解决方法: ① 保证头文件中的声明与 .c 文件中的实现一一对应。
- 滥用头文件
将实现代码直接写在头文件中可能导致代码冗余和重复定义。
解决方法: ① 在头文件中只写声明,将实现放在 .c 文件中。
综上。头文件在 C 语言中是实现模块化编程的重要工具。通过合理使用头文件,可以提高代码的复用性、可读性和维护性。在实际开发中应注意以下几点:
- 将声明(函数、宏、数据类型)放在头文件中,将实现放在 .c 文件中。
- 使用头文件保护机制避免重复包含。
- 合理拆分和组织头文件,避免头文件之间的过度耦合。
- 熟悉并善用 C 标准库 的头文件,减少重复造轮子。
头文件的正确使用不仅能提高代码质量,还能让团队协作更加高效。下面,我用在实际开发中的项目管理,看看头文件在开发里的实际作用:
在大型项目中,合理组织头文件是实现模块化设计、团队协作和代码复用的关键。头文件的组织需要遵循一定的规则,以确保项目的结构清晰、依赖关系明确,并避免重复包含和命名冲突的问题。我们这里通过一个示例来说明如何在大型项目中组织头文件。
项目结构设计
1. 项目目录结构
在大型项目中,通常将头文件和源文件按照模块或功能分类,并将头文件放在一个专门的目录下。例如:
MyProject/
├── include/ // 头文件目录
│ ├── module1/ // 模块1相关头文件
│ │ ├── module1.h
│ │ └── utils1.h
│ ├── module2/ // 模块2相关头文件
│ │ ├── module2.h
│ │ └── utils2.h
│ └── common/ // 公共头文件
│ ├── config.h
│ └── macros.h
├── src/ // 源文件目录
│ ├── module1/
│ │ ├── module1.c
│ │ └── utils1.c
│ ├── module2/
│ │ ├── module2.c
│ │ └── utils2.c
│ └── main.c
├── build/ // 编译输出目录
├── Makefile // 构建脚本
└── README.md // 项目说明文件
2. 头文件命名规则
模块化命名:头文件应以模块命名,避免与其他模块或标准库头文件冲突。例如:
module1.h
表示模块1的主头文件。utils1.h
表示模块1的工具函数头文件。
公共头文件:将项目中的全局配置、宏、数据类型定义等公共内容放在 common/
目录下,如 config.h
和 macros.h
。
头文件的内容组织
1. 主模块头文件
主要提供模块的外部接口声明,供其他模块使用。(系统提供的头文件通常以 _
开头,自己写的头文件通常以__
开头,防止重复定义)
只包含必要的内容,隐藏模块内部实现细节。
// module1.h
#ifndef __MODULE1_H
#define __MODULE1_H#include <stdio.h> // 标准库头文件
#include "common/config.h" // 项目公共头文件// 模块1对外的函数声明
void module1_init();
void module1_process();#endif // __MODULE1_H
此处出现了文章开头的问题: <stdio.h>
和 "stdio.h"
这两种写法皆可行吗?为什么?这二者有何区别呢?#include <stdio.h> // 标准库头文件
和 #include "common/config.h" // 项目公共头文件
<>
和""
:<>
:根据系统提供的路径去寻找头文件(/usr/include
);""
:根据自己提供的路径去寻找头文件,如果没有找到,再去系统提供的路径下寻找。
因此,引用头文件时,<stdio.h>
和 "stdio.h"
两种写法都可行,但一般情况下,我们仍然使用 <>
引用,因为使用 ""
引用时,如果在自己提供的路径中未找到头文件,又会重新在系统路径下再寻找一次,额外消耗了性能,这么做性价比不高,所以,使用系统标准库头文件时均使用 <>
引用。例如,最常使用的 #include <stdio.h>
:
stdio.h (英语:standard input/output header,标准输入/输出头文件)是C语言为输入输出提供的标准库头文件,其前身是迈克·莱斯克20世纪70年代编写的“可移植输入输出程序库”。
C语言中的所有输入和输出都由抽象的字节流来完成,对文件的访问也通过关联的输入或输出流进行。
2. 工具函数头文件
定义模块内部使用的工具函数或辅助功能,通常不直接对外暴露。
// utils1.h
#ifndef __UTILS1_H
#define __UTILS1_H// 模块1内部工具函数
int helper_function(int a, int b);#endif // __UTILS1_H
3. 公共头文件
定义整个项目的全局配置、数据类型、宏和其他公共内容。
这些头文件通常被多个模块共享。
// config.h
#ifndef __CONFIG_H
#define __CONFIG_H// 项目全局配置
#define MAX_BUFFER_SIZE 1024
#define PROJECT_NAME "MyProject"#endif // __CONFIG_H
// macros.h
#ifndef __MACROS_H
#define __MACROS_H// 常用宏定义
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))#endif // __MACROS_H
头文件的相互引用
1. 避免循环依赖
在大型项目中,头文件可能会相互包含,导致循环依赖问题(A.h 引用 B.h,而 B.h 又引用 A.h)。为避免此问题:
- 使用前向声明(Forward Declarations)代替直接包含头文件。
- 仅在需要完整类型定义时包含相关头文件。
// module2.h
#ifndef __MODULE2_H
#define __MODULE2_H#include "common/config.h"// 使用前向声明避免包含 module1.h
struct Module1;// 模块2对外接口
void module2_process(struct Module1* module1_instance);#endif // __MODULE2_H
示例:模块间协作
以下是一个完整的示例,展示如何组织和使用头文件和源文件。(结合上图更容易理解)
- module1.h
#ifndef __MODULE1_H
#define __MODULE1_H#include <stdio.h>// 模块1的初始化函数
void module1_init();#endif // __MODULE1_H
- module1.c
#include "module1.h"void module1_init() {printf("Module 1 initialized.\n");
}
- module2.h
#ifndef __MODULE2_H
#define __MODULE2_H#include "module1.h"// 模块2的处理函数
void module2_process();#endif // __MODULE2_H
- module2.c
#include "module2.h"void module2_process() {module1_init(); // 调用模块1的函数printf("Module 2 processing.\n");
}
- main.c (主函数)
#include "module2.h"int main() {module2_process();return 0;
}
- 编译与运行
使用gcc
进行编译和链接:
gcc -Iinclude src/module1.c src/module2.c src/main.c -o MyProject
运行程序:
./MyProject
输出:
Module 1 initialized.
Module 2 processing.
综上。在项目中头文件的组织是非常重要的环节之一:
- 模块化设计:每个模块有自己的头文件,头文件只暴露必要的接口。
- 公共头文件独立管理:将公共配置、宏和常量集中放置在
include/common/
目录下。 - 避免重复包含:使用头文件保护(
#ifndef...#define
或#pragma once
)。 - 减少头文件依赖:使用前向声明避免不必要的头文件包含。
- 按需包含:仅在需要的源文件中包含头文件,避免头文件之间的过度耦合。
因此,通过合理组织头文件,可以让大型项目的结构更加清晰,团队协作更加高效,同时减少调试和维护的复杂度。(想要进一步了解 如何组织和使用多个库,以及多库文件管理: <链接:多库文件管理中头文件的组织结构可参考这篇文章>)。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!
相关文章:
【C语言】头文件
所有学习过C语言的朋友都熟悉这样一段代码: #include <stdio.h>int main(int argc, char *argv[]) {return 0; }那么,你真的了解 <stdio.h> 吗? <stdio…...
WSL (Windows Subsystem for Linux)
文章目录 Windows下使用Linux的三种方式:1.WSL(1)安装WSL(2)初始化Linux系统(3)安装、创建、激活 Python虚拟环境 2.虚拟机3.Docker Windows下使用Linux的三种方式: 1.WSL 是最简单的在 Windows 上运行 Linux 环境的方式,适用于日常开发和命…...
[Java] 使用 VSCode 来开发 Java
目录 前言Java 环境怎么看自己是否已经配置完成?安装 JDK安装 Maven 环境修改 Maven 依赖源 完善 VS Code配置插件配置 Maven配置 Maven Settings配置 Maven 可执行文件地址 前言 由于使用 VSCode 编码已经成为习惯,并且它确实相对其他的 IDE 较为轻量化…...
机器学习之偏差
机器学习中的偏差(Bias)是指模型的预测值与真实值之间的系统性误差,或者说模型无法准确捕捉数据中复杂模式的能力。偏差通常与模型的假设或学习能力有关,过高的偏差会导致模型的性能不佳,表现为欠拟合。 偏差的来源 模…...
微信小程序处理交易投诉管理,支持多小程序
大家好,我是小悟 1、问题背景 玩过微信小程序生态的,或许就有这种感受,如果收到投诉单,不会及时通知到手机端,而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…...
在C#中测试比较目录的不同方法以查看它们有哪些共同的文件
C# 中的示例“比较目录以查看它们有哪些共同的文件”使用Directory.GetFiles获取两个目录中的文件。它对文件进行排序,并比较两个排序后的列表以查看哪些文件位于第一个目录中、第二个目录中或两个目录中。有关其工作原理的详细信息,请参阅该示例。 Kur…...
2D gaussian splatting的配置和可视化
继3D gaussian splatting,2D gaussian splatting除了渲染新视角,还能够生成mesh模型。 2D gaussian splatting的配置 两者的运行环境基本一致 GitHub - hbb1/2d-gaussian-splatting: [SIGGRAPH24] 2D Gaussian Splatting for Geometrically Accurate …...
git分支管理
目录 1.Git分支管理1.1 分支创建1.2 分支删除1.3 分支合并1.4 分支的本质1.5 分支的冲突 2.Git stash2.1 git stash 3.分支管理策略3.1主分支3.2辅助分支3.3Feature分支3.4release分支3.5bugfix分支 1.Git分支管理 Git 的默认分支就是 master。你所作的commit会在master分支上…...
【Elasticsearch入门到落地】4、Elasticsearch的安装
接上篇《3、es与mysql的概念对比》 上一篇我们学习了Elasticsearch与Mysql的概念与区别。本篇我们来进行Elasticsearch的环境准备及软件安装。 一、环境准备 如果我们没有自己的Linux服务器,且现在正在使用的是Windows操作系统的电脑,那么首先我们需要安…...
如何在谷歌浏览器中开启安全浏览
在数字化时代,网络安全变得愈发重要。作为全球最受欢迎的网络浏览器之一,谷歌浏览器提供了多种功能来保护用户的在线安全。本文将详细介绍如何在谷歌浏览器中开启安全浏览,并额外提供一些有用的页面滚动设置、地址栏快捷搜索和跟踪防护的相关…...
短视频矩阵贴牌:打造品牌新势力的策略与实践
在数字化浪潮席卷全球的今天,短视频以其独特的魅力迅速崛起,成为连接用户与品牌的重要桥梁。企业为了快速抢占市场,提升品牌影响力,纷纷探索短视频矩阵贴牌这一新兴模式。本文将深入探讨短视频矩阵贴牌的概念、优势、实施流程及注…...
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
目录 一、前言 二、Spring Boot 简介 三、Spring Boot 核心模块 四、Spring Boot 项目实战:构建一个简单的 RESTful API 1. 创建 Spring Boot 项目 2. 配置数据库 3. 创建实体类 4. 创建 JPA 仓库接口 5. 创建服务层 6. 创建控制器层 7. 测试 API 8. 运…...
linux basics
本篇文章旨在为网络安全初学者介绍linux操作系统基础。通过阅读本文,读者将能够对linux系统有一个初步的了解 一、openssl 1、命令: openssl passwd -1 123 -l参数指定使用MD5加密算法对密码"123"进行加密处理。MD5是一种常用的哈希算法,它将…...
[OpenGL] Transform feedback 介绍以及使用示例
一、简介 本文介绍了 OpenGL 中 Transform Feedback 方法的基本概念和代码示例。 二、Transform Feedback 介绍 1. Transform Feedback 简介 根据 OpenGL-wiki,Transform Feedback 是捕获由顶点处理步骤(vertex shader 和 geometry shader࿰…...
pytorch_fid 安装笔记
目录 torch安装: pytorch_fid安装 torch安装: pip install torch2.5.0 --index-url https://download.pytorch.org/whl/cu121 pytorch_fid安装 pip install pytorch_fid 安装后,torch也会自动安装,导致torch引用报错。...
SAM大模型实践(一)
参考着segment-geospatial 项目主页的介绍,尝试复现一下Example-satallite的案例。 Satellite - segment-geospatialhttps://samgeo.gishub.org/examples/satellite/ 过程当中遇到了一些坑给大家做点分享,主要有几种情况,一个是torch…...
数据结构 ——前缀树查词典的实现
数据结构 ——前缀树查词典的实现 一、前缀树的概念 前缀树是一种多叉树结构,主要用于存储字符串。每个节点代表一个字符,路径从根节点到叶节点表示一个完整的字符串。前缀树的关键特征是 共享前缀,也就是说,如果两个字符串有相…...
边缘智能创新应用大赛获奖作品系列一:智能边缘计算✖软硬件一体化,开启全场景效能革命新征程
边缘智能技术快速迭代,并与行业深度融合。它正重塑产业格局,催生新产品、新体验,带动终端需求增长。为促进边缘智能技术的进步与发展,拓展开发者的思路与能力,挖掘边缘智能应用的创新与潜能,高通技术公司联…...
修改ubuntu apt 源及apt 使用
视频教程:修改ubuntu apt 源和apt 使用方法_哔哩哔哩_bilibili 1 修改apt源 1.1 获取阿里云ubuntu apt 源 https://developer.aliyun.com/mirror/ubuntu?spma2c6h.13651102.0.0.3e221b11mqqLBC 1.2 修改apt 源 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/ub…...
Kafka 磁道寻址过程详解
前言 Apache Kafka 是一款高吞吐、分布式的消息流平台,广泛应用于实时数据处理和事件驱动系统。在 Kafka 中,消息是存储在磁盘上的,这种高效的数据读写性能得益于 Kafka 独特的磁盘存储架构和寻址机制。本文将从 Kafka 的存储结构、磁道寻址…...
GEE+本地XGboot分类
GEE本地XGboot分类 我想做提取耕地提取,想到了一篇董金玮老师的一篇论文,这个论文是先提取的耕地,再做作物分类,耕地的提取代码是开源的。 但这个代码直接在云端上进行分类,GEE会爆内存,因此我准备把数据下…...
安防监控Liveweb视频汇聚融合平台助力执法记录仪高效使用
Liveweb平台可接入的设备除了常见的智能分析网关与摄像头以外 ,还可通过GB28181协议接入执法记录仪,实现对执法过程的全程监控与录像,并对执法轨迹与路径进行调阅回看。那么,如何做到执法记录仪高效使用呢? 由于执法记…...
酷盾安全:Edge SCDN边缘安全内容分发网络
在当今数字化迅猛发展的时代,互联网内容分发的高效与安全成为了企业不可忽视的重要课题。为了满足这一需求,酷盾安全推出了创新的Edge Secure Content Delivery Network(Edge Scdn)解决方案,它不仅融合了分布式DDoS防护…...
决策引擎技术
决策引擎(Decision Engine)是一种用于自动化决策过程的软件系统。它通常用于处理复杂的业务逻辑,根据输入的数据和预定义的规则或模型来做出决策。决策引擎在许多领域都有广泛的应用,如金融、保险、医疗、供应链管理等。 在Java中…...
Servlet学习中遇到的一些问题及解决
错误:JavaWeb-错误:类xxx不是Servlet 解决:可能是Tomcat版本不匹配导致,更换Tomcat版本解决问题 错误:在自定义的Servlet类中不能添加 WebServlet 注解 解决:可能是WebServlet版本不匹配,更换…...
oracle开窗函数笔记、over()笔记
文章目录 开窗函数、组函数、分析函数概念聚合函数和分析函数的区别partition by后面也可以跟多个字段 开窗函数一定要加 聚合函数、或分析函数吗,否则会报错lag()和lead()的用法lag和lead实战开窗函数可以和其他函数一起使用吗? TODO开窗函数中的count(1)是什么意…...
深度学习面试相关-2024.12.15记录
深度学习 面试相关- 2024.12.15记录 目录 深度学习 面试相关- 2024.12.15记录整体常问问题1数学基础1.1 概率统计1.2 线代 2机器学习算法2.1 深度学习算法2.2 机器学习算法 整体常问问题 https://www.nowcoder.com/discuss/353154899112304640 1数学基础 1.1 概率统计 htt…...
CSS|07 标准文档流
标准文档流 一、什么是标准文档流 在制作的 HTML 网页和 PS 画图软件画图时有本质上面的区别: HTML 网页在制作的时候都得遵循一个“流的规则:从左至右、从上至下。 使用 Ps 软件画图时可以在任意地方画图。 <!DOCTYPE html> <html lang"en"> <hea…...
1 JVM JDK JRE之间的区别以及使用字节码的好处
JDK jdk是编译java源文件成class文件的,我们使用javac命令把java源文件编译成class文件。 我们在java安装的目录下找到bin文件夹,如下图所示: 遵循着编译原理,把java源文件编译成JVM可识别的机器码。 其中还包括jar打包工具等。主要是针对…...
ubuntu安装8812au驱动却无法加载网卡的问题
驱动GIT地址 https://github.com/aircrack-ng/rtl8812au按照里面提示安装驱动 输入 sudo dkms status查看驱动是否安装成功 接入网卡,看看ifconfig能否输出网卡 如果不行 使用sudo dmesg -w插拔网卡看看输出 如果输出为: load module with unavailable key is …...
Eureka学习笔记-服务端
Eureka学习笔记 服务端 模块设计 Resources :这部分对外暴露了一系列的 Restful 接口。Eureka Client 的注册、心跳、获取服务列表等操作都需要调用这些接口。另外,其他的 Server 在同步 Registry 时也需要调用这些接口。Controller :这里提…...
LangChain
文章目录 一、LangChain 是什么?二、核心概念1. LLM Wrappers2. Prompt Templates3. Indexes4. Chains5. Agents 三、工作流程四、应用场景示例一:简单的语言模型调用示例二:使用Prompt Templates(提示模板)示例三&…...
搭建分布式Hive集群
title: 搭建分布式Hive集群 date: 2024-11-29 23:39:00 categories: - 服务器 tags: - Hive - 大数据搭建分布式Hive集群 本次实验环境:Centos 7-2009、Hadoop-3.1.4、JDK 8、Zookeeper-3.6.3、Mysql-5.7.38、Hive-3.1.2 功能规划 方案一(本地运行模…...
Scala的惰性求值:深入理解与实践
在编程中,我们经常需要处理那些计算成本高昂或者可能永远不会用到的值。在这种情况下,惰性求值(Lazy Evaluation)是一种非常有用的策略。它允许我们推迟计算,直到这些值真正需要被使用。Scala,作为一种多功…...
游戏引擎学习第54天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体,这些实体位于玩家的视野中,频繁更新,而那些离玩家较远的实体则以较低的频率运…...
QT绘制同心扇形
void ChartForm::paintEvent(QPaintEvent *) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 设置抗锯齿painter.save();// 设置无边框(不需要设置QPen,因为默认是不绘制边框的)QPen pen(Qt::NoPen);// QPen pen…...
梳理你的思路(从OOP到架构设计)_浅尝架构师的滋味02
目录 1、 App开发者的职责:买主提供需求知识,App开发者帮他写代码 撰写的代码 撰写代码,将装配(扩充)到 2、 从生活中体会 基於軟硬整合觀點“两种知识” 编辑 1、 App开发者的职责:买主提供需求知识,App开发者帮…...
使用VLC 搭建 RTSP 服务器
第一步:打开 VLC ,媒体--->流 第二步:添加一个选择本地的文件,然后点击选择"串流" 第三步:确认你选择的文件,然后点击下一个 第四步: 配置 选择的视频文件使用哪种 流输出…...
什么是大型语言模型
大型语言模型简介 大型语言模型 (LLM) 是一种深度学习算法,可以使用非常大的数据集识别、总结、翻译、预测和生成内容。 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息?加入 NVIDIA 开发者计划,即可免费访问任何基础设施云、数据中心或个…...
游卡,科锐国际,蓝禾,汤臣倍健,顺丰,途游游戏25秋招内推
游卡,科锐国际,蓝禾,汤臣倍健,顺丰,途游游戏25秋招内推 ①科锐国际25届秋招补录 人力资源类岗位,补录城市:上海,苏州,锦州;全日制公办本科及以上 25届应届毕业…...
Linux -- 线程控制相关的函数
目录 pthread_create -- 创建线程 参数 返回值 代码 -- 不传 args: 编译时带 -lpthread 运行结果 为什么输出混杂? 如何证明两个线程属于同一个进程? 如何证明是两个执行流? 什么是LWP? 代码 -- 传 args&a…...
【Linux】Linux内核启动流程分析
Linux 内核的启动流程要比 uboot 复杂的多,涉及到的内容也更多,因此我们大致的了解一下Linux 内核的启动流程即可。 Linux启动流程 启动过程可以分为以下几个主要步骤: 1.引导加载程序(Bootloader)阶段 Linux 内核的…...
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙 uniapp不是仅支持低功耗蓝牙(基础蓝牙通讯不支持),有些可能需要基础蓝牙。我现在同步我的手机蓝牙列表低功耗,基础蓝牙都支持 /*** author wzj* 通用蓝牙模块封装* 搜索 ble 和非…...
OpenGL ES 03 加载3张图片并做混合处理
OpenGL ES 02 加载3张图片并做混合处理 什么是纹理单元纹理单元的作用使用纹理单元的步骤详细解释加载图片并绑定到到GPU纹理单元采样器的设置1.设置采样器变量的纹理单元编号,目的是为了告诉纹理采样器,从哪个纹理单元采集数据2.如果你没有显式地设置采…...
c++数据结构算法复习基础--13--基数算法
基数排序 - 桶排序 时间复杂度 O(n*d) – d为数据的长度 每次比较一位(个位、十位。。。),所以取值范围就为0-9。 根据该特点,设计桶的概念 – 0号桶、1号桶… 1、思想 1)找出最长的数字,确定要处理的…...
基于YOLOv5的行人与帽子检测与识别说明文档
基于YOLOv5的行人与帽子检测与识别说明文档 1. 任务的内容和目标 1.1 任务目标 在计算机视觉领域,头盔检测至关重要,主要用于判定图像或视频里的人是否佩戴头盔。于工业生产、建筑工地、交通出行(如摩托车与自行车骑行)等高危场…...
Mybatis——(2)
2.2 Mybatis 工具类(了解) 为了简化MyBatis的开发,可将MyBatis进一步封装。 import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apa…...
QT笔记- QSystemTrayIcon系统托盘功能完整示例
1. 创建托盘对象 // 创建托盘图标QSystemTrayIcon * trayIcon new QSystemTrayIcon(this);QIcon icon("://icon/test.png");trayIcon->setIcon(icon);trayIcon->show();trayIcon->connect(trayIcon, &QSystemTrayIcon::activated,this, &MainWindo…...
ElasticSearch08-分析器详解
零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器(Analyzer)是全文搜索的核心组件,它负责将文本转换为一系列单词(term/token)的过程,也叫分词。 (1ÿ…...
指针的深入讲解
本章重点: 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数 我们在指针的初阶的时候主要讲了: 1.指针就是变量,用来存放地址,地址唯一标识一块内存空间 2.指针的大小是固定4个…...