朝花夕拾 · C语言 | 多文件篇

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

全局变量使用:

1.在源文件中定义全局变量;

2.如果只是在定义该全局变量的文件中使用该全局变量,可以不声明;

3.如果要在一个外部的源文件中使用该全局变量,则该变量必须被声明;

4.在对应的头文件中加extern关键字声明,头文件中全局变量只能声明不能初始化,定义应在.c文件

        在头文件的声明里,函数默认为extern,编译器会自动加上。

  1. 预处理阶段(只认 #include):
    预处理器看到 #include "ji.h",把 ji.h 里的 int get_ji(int num1, int num2); 复制过来。看到 #include "shang.h",把 shang.h 里的声明复制过来。
    此时,main.c 里只有“声明”(知道有这两个函数),但没有“定义”(不知道这两个函数具体怎么算)。

  2. 编译 + 链接阶段(关键区别):
    如果只输入 gcc main.c,编译器会报错:undefined reference to 'get_ji' 和 undefined reference to 'get_shang'。因为编译器只编译了 main.c,找不到 get_ji 和 get_shang 的具体代码(定义)。头文件只是“承诺”这些函数存在,但真正的“兑现”需要靠链接器把对应的 .c 文件编译结果合并进来。

Makefile:管理代码工程的编译和链接,由make工具进行解释,实现一键化工程的编译和链接。

文件:Makefile/makefile(文件/脚本)

语法:

          目标文件:依赖文件       

                     编译规则

目标文件:a.out

依赖文件(生成目标文件所依赖的源文件):main.c  sum.c  sub.c ......

编译规则:gcc main.c sub.c sum.c  ( -o a.out)

编译代码:make(默认只匹配makefile中的第一个参数)

a: 01_a
    gcc 01_a -o a -lpthread
b: 01_b
    gcc 01_b -o b
clean:
    rm a b

make a匹配到a则执行 gcc 01_a -o a -lpthread
make b匹配到b则执行 gcc 01_b -o b -lpthread
make clean匹配到clean则执行 rm a b

Makefile中的变量:

1.自定义变量

OBJ = a.out    //定义Makefile的变量OBJ,并为其赋值
SRC = main.c sum.c sub.c 
== SRC += main.c
   SRC += sum.c
   SRC += sub.c
CC = gcc
INCLUDE = ../include    //include"xxx"双引号里的内容只能在当前路径下访问,所以使用-I指明头文件路径
LIBS = ../lib


$(OBJ) :$(SRC)    //变量的引用:$()
    $(CC) $(SRC) -o$@ -I$(INCLUDE) -L$(LIBS) -lm
                 //-o $(OBJ) 给自定义变量起名
                 //-I头文件路径 -L指定库的位置
                 //-lm链接数学库

==
    a.out: main.c sum.c  sub.c 
    gcc main.c sub.c sum.c 


自定义伪代码:
clean:
    rm $(OBJ)    //表示clean实现移除文件功能
                    //用 make clean调用

   =:给变量赋值

   +=:在原变量值的基础上再增加新增

   ?=:  若变量之前没有被赋值则赋值,若之前被赋过值则保留原值

注意:只改头文件的话make并不会检测到头文件的修改,所以修改头文件后,需clean重新生成可执行文件,而若没在头文件中声明函数,则有时可能发生段错误。

再例如:

target = led
objs = start.o main.o

$(target).bin : $(objs)
	arm-linux-gnueabihf-ld -Timx6ull.lds $(objs) -o $(target).elf
	arm-linux-gnueabihf-objcopy -O binary -S -g $(target).elf $(target).bin
	arm-linux-gnueabihf-objdump -D $(target).elf > $(target).dis

%.o : %.S
	arm-linux-gnueabihf-gcc -g -c $^ -o $@	
%.o : %.c
	arm-linux-gnueabihf-gcc -g -c $^ -o $@	

clean:
	rm $(objs) $(target).elf $(target).bin $(target).dis  

整个流程其实是 “依赖倒推 + 模式匹配”,分三步:

第一步:看最终目标需要什么
$(target).bin : $(objs)

这行告诉 make:“要生成 led.bin,必须先有 start.o 和 main.o。”

第二步:发现 .o 文件不存在,去寻找生成它们的规则

make 开始检查 start.o 和 main.o:

  • 如果它们不存在,或者比对应的 .c/.S 文件旧,make 就要想办法生成它们。

  • 此时 make 在 Makefile 里搜索所有“目标能匹配 %.o”的规则,找到了:

    %.o : %.S
    %.o : %.c
第三步:自动匹配并执行编译
  • start.o 匹配到 %.o : %.S 规则(因为磁盘上有 start.S),于是自动执行:

    arm-linux-gnueabihf-gcc -g -c start.S -o start.o
  • main.o 匹配到 %.o : %.c 规则(因为磁盘上有 main.c),于是自动执行:

arm-linux-gnueabihf-gcc -g -c main.c -o main.o

$^ 代表“所有依赖文件”(即 %.S 或 %.c),$@ 代表“目标文件”(即 .o)。所以这条命令是通用的,能自动套用到任何 .c 或 .S 文件上。

敲下 make
  ↓
make 想生成 led.bin
  ↓
需要 start.o 和 main.o
  ↓
start.o 不存在 → 查规则 → 匹配 %.o : %.S → 编译 start.S
  ↓
main.o 不存在 → 查规则 → 匹配 %.o : %.c → 编译 main.c
  ↓
两个 .o 都齐了 → 执行链接 → 生成 led.elf
  ↓
objcopy 转成 led.bin
  ↓
objdump 生成反汇编 led.dis

2.系统变量

可直接使用:

$@:表示目标文件

$^ :表示所有依赖文件

$<:表示第一个依赖文件

3.

tar -cvf 文件夹.tar 文件夹 

压缩文件夹

SpringBoot+Vue+Mysql社区医院信息平台(源码+文档) SpringBoot+Vue+Mysql学生宿舍信息管理系统 WEB端软件项目(源码+文档) 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本文件;③万字论文文档;④开题报告;⑤答辩PPT;⑥项目运行视频教程。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI+ECharts、用户前台 Layui+jQuery、Maven 构建。 一、角色设计 学生用户: 注册登录、浏览宿舍信息、查询宿舍安排、在线报修、缴费查询、失物招领、桶装水预订、评论交流、收藏等。 商家用户: 注册登录、桶装水品牌与商品信息维护、预订订单查看与处理。 维修人员: 注册登录、查看待处理报修、接单维修、填写报修处理结果与进度反馈。 管理员: 学生管理、班级管理、宿舍信息管理、宿舍安排管理、报修处理管理、缴费信息管理、卫生检查与文明宿舍管理、失物招领管理、桶装水与商家管理、维修人员管理、公告资讯与轮播图管理等。 二、前台功能模块(学生端) 1. 首页展示:轮播图、宿舍公告、最新动态推荐、常用服务快速入口 2. 宿舍信息模块:宿舍列表、楼栋与房间条件筛选、宿舍详情查看、我的宿舍安排查询 3. 在线报修模块:在线提交宿舍设施报修申请、上传故障描述、查看报修进度与维修处理结果 4. 缴费模块:水电等缴费记录查询、缴费状态查看 5. 卫生检查与文明宿舍:宿舍卫生检查结果公示、文明宿舍展示 6. 失物招领模块:失物信息发布、招领信息发布、详情查看、评论互动 7. 桶装水预订:桶装水品牌与商品浏览、在线预订、我的预订记录查询 8. 假期留宿:假期留校申请提交、申请记录查询 9. 评论与收藏:信息评论、查看他人评论、评论回复互动、收藏感兴趣的内容 10. 个人中心... 立即下载

相关推荐

YOLOv8作物病害检测实战源码

这是一套基于YOLOv8n的农田病虫害目标检测系统,对叶片照片做目标检测,识别健康叶片、褐斑病、白粉病、锈病四类,并给出对应防治建议。全流程纯CPU可跑,配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、100张自造样本及YOLO标签、训练曲线与混淆矩阵截图、Tkinter界面和答辩PPT。 系统围绕五项功能展开:同一套推理逻辑覆盖图像、视频、摄像头三种来源;图形界面选文件即检测,画面叠彩色框标注病名与置信度,右侧面板同步给出症状与防治措施;检测记录自动写入CSV,统计页一键生成四类病害占比饼图;训练结束自动产出损失与精度曲线;内置防治建议文案库,检测命中即回填面板。 选型用YOLOv8n nano档,参数量约320万、权重约6.2MB,CPU单帧几十毫秒,小样本训练5到8分钟完成。数据由data_gen.py程序化绘制100张叶片图,固定随机种子,重跑分布一致,不依赖公开数据集。依赖全部锁版本,教程第7章整理了19条真实报错及排查方法,第8章给出换模型档、换PlantVillage数据集的迁移路径。 适合做计算机视觉方向课程设计或毕业设计的学生,也适合智慧农业方向想了解检测模型如何落进业务面板的学习者。不需要GPU,不需要系统学过目标检测,教程第3章会按需补齐原理。 使用时先pip install -r requirements.txt装好依赖,download_data.py下载预训练权重,data_gen.py生成样本后train.py训练,完成后用main.py infer批量检测或main.py gui启动界面。

朝花夕拾 · C语言 | 预处理命令篇

预处理:展开和#相关的代码:展开头文件、展开宏、处理预处理命令编译:将c语言程序转换成汇编指令。汇编:将汇编指令转换成二进制可执行程序链接:负责链接系统的函数/库函数的实现(链接函数)

Vvc_Python的博客 386

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

朝花夕拾 · C语言 | 函数篇

此外 ,%f 不能接收double型,且双引号里写了什么,在输入时也要相同,所以除了格式控制符之外尽可能少写其他数据。八进制与十六进制也可指定输出域宽,如%8o表示输出八位八进制数,%8x表示输出八位十六进制数;此外,%lo与%lx则可表示以八和十六进制输出long型。在输入整型时,可以使用空格,Tab与Enter隔开两数,除此之外用其他字符则会直接中断输入,舍弃后续读入的数字。域宽输出: 7. %nd 以n位域宽输出,若数据大于n位则以实际位数输出,否则左侧补空。

Vvc_Python的博客 349

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?.docx

科技中介服务机构在技术供需对接中如何实现服务流程的自动化与标准化?

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

static 的三种用法:C 语言里一个关键字的三张面孔

本文系统讲解 C 语言中 static 关键字的三种用法:修饰局部变量延长生命周期、修饰全局变量与函数限制作用域到本文件。通过一个包含三个文件的完整工程示例对照演示,并从存储期、作用域与链接性三个属性解释其统一原理,最后补充单元测试框架偏爱 static 函数的工程实践。

大模型全栈工程师 · Thanks_ks 316

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c

AI 编程时代,开发语言选型需综合考量AI适配度、编译速度、跨平台与学习成本。Python以海量语料和即时执行成首选,适用于AI/ML与原型开发;TypeScript凭借类型系统与秒级构建,成为前端及应用层主流;Go以极速编译与统一风格,契合AI代理高效迭代需求。Rust/C++虽性能强,但编译慢、学习成本高,不适于快速试错。综合推荐:优先选Python、TypeScript、Go,兼顾效率与生态,实现最优AI协作体验。

freewebsys的专栏 550

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员如何系统化管理科技成果信息?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

ICD10 openGauss版

ICD10 openGauss版

科技中介服务机构如何构建标准化、模块化的智能服务工具?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

产业园区运营负责人如何利用平台实现企业创新需求的精准分析与服务推送?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

fab-pm-optimizer-python-entry-py39-20261021-v1-1-0

PSIM-三相维也纳VIENNA整流器电压电流双闭环+中点电位平衡SVPWM控制仿真

内容概要:本文档详细介绍了一种基于PSIM软件实现的三相维也纳(VIENNA)整流器仿真模型,重点实现了电压电流双闭环控制与中点电位平衡的SVPWM调制策略。该仿真系统通过精确的控制算法有效提升了整流器的功率因数,降低了输入电流谐波含量,并解决了三电平拓扑中常见的直流侧中点电位偏移问题,具有较高的工程实用价值,适用于高效率、高功率密度的电力电子系统设计与科研验证。文档还整合了丰富的配套资源,涵盖多种电力电子变换器拓扑结构、先进控制算法及典型应用场景,形成了系统化的技术资料体系,有助于深入理解现代整流技术的核心原理与发展动态。; 适合人群:面向从事电力电子、电气工程、新能源变换系统等领域的科研人员、高校研究生以及具备一定仿真基础的工程技术人员。; 使用场景及目标:①深入研究三相VIENNA整流器的工作机理与控制特性;②掌握电压外环、电流内环双闭环控制结构的设计方法;③理解并实现SVPWM调制技术与中点电位平衡控制策略的协同作用;④开展相关控制算法的仿真验证、性能优化与实验对比,为高性能整流装置的研发提供理论支撑和技术原型。; 阅读建议:建议结合文中列出的其他仿真案例(如PWM整流器、LLC谐振变换器、DAB变换器等)进行横向对比学习,充分利用所提供的PSIM、MATLAB/Simulink等多平台仿真资源,重点关注控制逻辑与主电路的耦合关系,通过参数调试与波形分析深化对系统动态响应和稳态性能的理解,强化“理论—建模—仿真—优化”的闭环研究能力。

高校技术转移办公室人员在推动成果转化落地过程中,如何实现科技成果的高效推介与价值评估?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

产业园区运营负责人如何利用数智工具提升园区企业的技术对接效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

上一篇: 朝花夕拾 · C语言 | 调试篇
下一篇: 朝花夕拾 · 数据结构 | 链表篇
剑指offer.
博客等级 码龄3年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值