开发规范----静态库、动态库(嵌入式) 库的使用与.h文件的创建关系一、完全可以不写#include xxx.h程序能编译运行前提只用普通函数不涉及结构体、宏、自定义类型C 老标准会自动给未声明函数做隐式声明默认返回int参数任意。你只把.c打包成静态 / 动态库主函数里直接裸写调用hello();编译链接带上库就能生成可执行文件。缺点非常致命函数参数写错、传参类型不对、传多传少编译器不会报错运行随机崩溃函数实际返回值不是 int会发生数据截断一旦库里有结构体、枚举、#define 宏主程序完全无法识别代码写不了。二、规范写法必须新建一个 .h 头文件主程序#include标准流程企业 / 作业标准写法库源文件mylib.c放函数实现#include stdio.h void show(int a) { printf(%d\n,a); }新建头文件mylib.h专门放对外声明#ifndef MYLIB_H #define MYLIB_H void show(int a); // 只写声明不写实现 #endif把 mylib.c 编译打包成静态库 libmylib.a主程序 main.c 里 #include mylib.h#include mylib.h int main() { show(666); return 0; }这么做的意义编译阶段编译器检查参数数量、类型、返回值完全匹配错了直接报错结构体、宏、typedef 全部放在头文件调用方才能正常使用别人使用你的库时只需要拿.h.a/.so不用看你的.c源码。三、折中方案不建 .h直接在 main.c 手写函数声明不想新建文件可以在 main 最上方手动声明函数效果等价于 include 头文件// 手动声明库里面的函数 void show(int a); int main() { show(123); return 0; }适合函数极少的临时测试项目大了绝对不推荐不方便维护。最终结论懒人测试啥头文件都不用直接调用能跑但隐患极大正规开发一定要配套.h放声明主程序#include头文件不参与库的编译打包库只由.c生成.h只给调用方使用。额外知识点打包静态库 / 动态库的时候从头到尾不需要头文件参与。.h不属于库文件内容只是给调用者看的接口说明书。四、那你创建函数的.c文件要不要 带#include xxx.h呢1、先回答第一个点打包静态库只打包 add.c不带.h发给别人本身确实没有强制校验静态库libxxx.a里面只有编译后的机器码 函数符号名。 头文件.h不会被打进库里面库文件完全不知道外面有没有头文件、头文件叫什么。 所以理论上 我只发你libadd.a你自己随便新建一个test.h手写一行int add(int x,int y);只要签名对得上#include test.h就能正常调用。 文件名、头文件名字不需要和原作者的 add.h 一模一样。2、那原作者 add.c 里为什么一定要#include add.h这个校验是给自己编译库的时候用的不是给使用者用的。场景举例我写 add.hint add(int a,int b);我写 add.c 手误写成int add(int a){return a1;}如果 add.c 开头写了#include add.h编译gcc -c add.c直接报错声明和定义参数不匹配我当场改错。如果不加这行 编译 add.c 毫无报错顺利打包成库发给你。 你拿着库随便写个头文件调用编译时才发现参数对不上甚至运行崩掉。简单说#include add.h是库作者自查防止自己写实现写错 不是用来约束后续使用者的。3、使用者可以自定义头文件吗完全可以原项目add.h add.c → 打包 libadd.a 你拿到库之后完全可以不使用原 add.h自己新建一个叫my_api.h#ifndef MY_API_H #define MY_API_H int add(int m, int n); #endifmain.c 包含#include my_api.h照样正常链接使用库没有任何强制绑定关系。4、行业里为什么还要配套给原有的.h库里不止一个函数还有结构体、宏、枚举、类型重定义 这些东西只存在于.h里库二进制不带这些信息。 你不拿作者提供的头文件根本不知道结构体怎么定义没法传参。方便不用使用者手动挨个抄写所有函数声明直接拿头文件即可。约定俗成接口文件同名便于项目管理。5、极简总结打包库 ≠ 打包头文件库内无任何头文件信息add.c 引入自身 add.h作者自检防写错和第三方使用者无关使用者可以自创任意名称头文件只要函数声明签名一致就能调用正式交付库一定会附带原版.h是为了降低使用成本不是程序强制要求。补充一句最容易混淆的边界编译库本身需要.c 作者自己的.h做自检别人链接使用库只需要.a 任意一份正确声明的.h文件名无要求。

相关新闻

最新新闻

重庆转店平台哪个好?房源库再大,也要看你的门店有没有被单独经营

重庆转店平台哪个好?房源库再大,也要看你的门店有没有被单独经营

摘要:平台房源库大,只能说明整体规模;对单个转店老板更重要的是,门店有没有被单独整理、持续维护,并准确触达到匹配客户。不少重庆店老板在比较转店平台时,最容易被一个数字吸引:“我们平台有很…

2026/9/2 15:23:40
【更新至2025年】1996-2025年各省农村居民人均可支配收入数据(无缺失)

【更新至2025年】1996-2025年各省农村居民人均可支配收入数据(无缺失)

【更新至2025年】1996-2025年各省农村居民人均可支配收入数据(无缺失) 1、时间:1996-2025年 2、来源:国家统计局、统计年鉴 3、范围:31省 4、指标:农村居民人均可支配收入 5、缺失情况:无缺…

2026/9/2 15:23:40
EA4LLM: A Gradient-Free Approach to Large Language Model Optimization via Evolutionary Algorithms

EA4LLM: A Gradient-Free Approach to Large Language Model Optimization via Evolutionary Algorithms

你对这篇AI领域论文的核心内容与创新点提炼需求很关键,能快速把握研究价值。该论文提出了一种基于进化算法的LLM优化方法EA4LLM,突破了梯度优化的局限,首次实现10亿参数LLM的预训练阶段优化。 一、文章主要内容总结 研究背景:当前LLM优化主要依赖Adam等梯度优化方法,这类…

2026/9/2 15:23:40
ESP32-S3循迹小车硬件调试与分步测试指南

ESP32-S3循迹小车硬件调试与分步测试指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/2 15:23:40
服务器车间产线布局设计,怎么找靠谱服务商做方案?4 个核心要点 + 避坑指南

服务器车间产线布局设计,怎么找靠谱服务商做方案?4 个核心要点 + 避坑指南

最近好多做服务器制造的粉丝问我,新车间产线布局设计,怎么找靠谱服务商做方案?不少人踩了方案套模板、工艺流交叉、防静电分区混乱的坑,投产之后物流绕路、良率上不去,推倒重来损失动辄几十万。跑厂 8 年,我…

2026/9/2 15:23:40
单片机计算机毕设之基于 STM32 单片机的声光报警饮水设备物联网系统设计 基于 STM32 的手动自动双模式智能饮水控制系统设计(012106)

单片机计算机毕设之基于 STM32 单片机的声光报警饮水设备物联网系统设计 基于 STM32 的手动自动双模式智能饮水控制系统设计(012106)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/2 15:18:40