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

C 语言中函数声明、定义与链接的一点说明

在 C 项目中,可能会遇到下面这种情况:

  • 函数在某个头文件中声明
  • 在其他源文件中被调用
  • 却在另一个.c文件中实现
  • 并且实现该函数的.c文件没有包含对应的头文件
  • 程序依然可以正常编译和链接

示例代码场景

ssd1306.h

void ssd1306_WriteData(uint8_t data);


ssd1306.c

#include "ssd1306.h" ssd1306_WriteData(0xFF);


app.c

void ssd1306_WriteData(uint8_t data) { // 函数实现 }

注意:
app.c并没有#include "ssd1306.h"


核心原因

在 C 语言中,函数定义本身就包含了函数声明。

void ssd1306_WriteData(uint8_t data) { }

这段代码已经完整地告诉编译器:

  • 函数名
  • 参数类型
  • 返回值类型
  • 并提供了实现

因此,在实现函数的源文件中,
是否包含声明它的头文件,并不影响该函数是否存在


编译与链接阶段发生了什么

编译阶段

  • app.c
    编译器看到函数定义,记录下一个全局函数符号ssd1306_WriteData

  • ssd1306.c
    通过包含ssd1306.h,编译器知道该函数的声明,调用是合法的


链接阶段

链接器只关心一件事:

每一个被使用的函数,是否能找到唯一的实现

文件作用
ssd1306.o使用ssd1306_WriteData
app.o定义ssd1306_WriteData

符号匹配成功,链接自然通过。
链接器不会处理任何头文件


一句话总结

C 语言允许函数声明和定义分散在不同的源文件中,
只要链接阶段符号能够匹配,程序就可以正常工作。

ps:本文有AI辅助生成。

在学习过程中第一次见到这种写法,感觉不是很规范的写法。记录一下!!!

http://www.zskr.cn/news/138768.html

相关文章:

  • LangFlow Highlight.io开发者优先监控
  • 49、C编程:从Main方法到嵌套类型的全面解析
  • LangFlow Mouseflow点击分布与滚动图
  • Multisim14仿真结果导入Ultiboard的实践方法
  • LangFlow GoatCounter极简网页计数器
  • STM32CubeMX串口通信接收图解说明(小白友好)
  • ESP32-CAM如何连接手机APP?一文说清通信机制(Arduino)
  • 掌握大数据领域 Hive 的动态分区技术
  • 2026年AI证书报考:当“一篇攻略”遇上现实困境
  • LangFlow Dotcom-Monitor全球节点检测
  • 基于cc2530的ZigBee协议开发实战案例解析
  • Multisim数据库访问失败:服务组件安装指南
  • OrCAD仿真接口配置:PSpice联合调试完整指南
  • jscope时序数据分析技巧:系统学习指南
  • Keil5嵌入式开发环境搭建:工业级项目应用
  • Unity3D中实现实时数字孪生的操作指南
  • 快速理解Vitis使用教程与Alveo硬件协同设计
  • 吉因加冲刺港股:上半年营收2.9亿亏4亿 华大基因与爱尔医疗是股东
  • 盖国强出席2025中国数字生态英雄会,共话AI时代的新战略
  • 我发现EWC框架让急诊模型持续学习不遗忘,误诊率直降
  • LangFlow GTmetrix网页性能分析
  • 小白指南:理解内存越界如何触发程序crash
  • LangFlow New Relic Browser监控前端性能
  • 小区疫情购物系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • LangFlow Freshping实时监控报警
  • LangFlow bmon带宽监视器和速率估算
  • LangFlow Hydra暴力破解防护验证
  • 32、网站复制与开发常见问题解答
  • 避免蓝屏与兼容问题:DDU驱动清除深度剖析
  • 基于Kibana的Elasticsearch索引管理全面讲解