c 语言文件后缀,是操作系统和编译器用来识别 c 语言相关文件类型的扩展名,最核心的源码后缀是 c,也就是我们编写的原始源代码文件,除此之外在 c 语言完整编译流程里,还会配套出现头文件目标文件可执行文件库文件等多种后缀,不同后缀对应编译不同阶段产生的文件,后缀本身不会改变文件内部代码逻辑,但是 IDE 和编译器会依靠后缀判断文件类型,决定是否按照 c 语言规则进行编译,很多初学者容易混淆,把头文件也当成主源码,不清楚各个后缀文件在编译流程里的分工,理解 c 语言文件后缀,是搭建 c 语言编译工程看懂编译报错的基础。
核心 c 语言相关后缀对照表
| 后缀 | 文件类型 | 说明 |
|---|---|---|
| c | c 源文件 | 存放主程序函数实现,是核心源代码,编译器主要编译对象 |
| h | 头文件 | 存放宏定义函数声明结构体声明,通过 include 引入到 c 源文件 |
| cc cpp cxx | c 加加源文件 | 虽然不是纯 c,但是很多工程混编环境会出现,不要和纯 c 源码混淆 |
| i | 预处理文件 | 预处理阶段输出文件,展开 include 宏定义之后的中间代码 |
| s | 汇编文件 | 编译阶段生成的汇编代码文本 |
| o obj | 目标文件 | 汇编之后生成的机器码目标文件,windows 下一般是 obj,linux 下是 o |
| exe | 可执行文件 | windows 平台链接完成之后生成的可运行程序 |
| out | 可执行文件 | linux gcc 默认链接输出的可执行程序 |
| a | 静态库文件 | linux 平台静态链接库,由多个 o 目标文件打包组成 |
| lib | 静态库文件 | windows 平台静态库 |
| dll | 动态库文件 | windows 动态链接库,运行时加载 |
| so | 动态库文件 | linux 动态链接库,运行时加载 |
编译流程和后缀文件产生顺序
1 编写阶段,开发者创建后缀为 c 的源文件,同时配套 h 头文件,书写代码。
2 预处理,处理 include 和宏,生成后缀 i 的中间文件。
3 编译转汇编,生成后缀 s 的汇编文本文件。
4 汇编处理,把汇编转为机器码,生成 o 或者 obj 目标文件。
5 链接阶段,把多个目标文件和库文件合并,最终生成 exe 或者 out 可执行文件。
关键细节说明
第一 后缀只是命名标记,不是强制硬性限制,理论上可以把 c 源码改成 txt 后缀,但是 gcc 和 IDE 不会自动识别,需要手动指定编译语言类型,不推荐这种写法,团队协作会造成混乱。
第二 头文件后缀 h 本身没有强制要求必须写声明,也可以写函数实现,但是工程规范不推荐把头文件写完整函数实现,容易出现重复定义错误。
第三 区分纯 c 和 c 加加,gcc 编译器看到后缀 cpp 会默认按 c 加加语法解析,看到后缀 c 默认按 c 标准解析,这就是很多代码改后缀之后编译报错的原因,语法规则切换了。
第四 跨平台项目,同样一份 c 语言源码,windows 编译产物后缀是 obj exe lib dll,linux 编译产物后缀是 o out a so,源码本身 c 后缀保持不变,只是编译输出后缀随平台变化。
常见误区
误区一 认为 h 文件是必须单独编译的源文件,实际上 h 文件不会单独编译,是被 c 文件 include 之后参与编译。
误区二 认为后缀决定代码语法,实际上后缀只是告诉编译器使用哪一套语法规则,修改后缀不会修改代码本身。
误区三 认为所有 c 语言项目只能使用 c 后缀,部分嵌入式工程会使用 inc 等自定义后缀,属于项目自定义约定,不属于标准后缀。
综合来说,c 语言文件后缀核心就是 c 源码加 h 头文件,其余 o obj exe a so 等后缀属于编译各个阶段的产物,掌握这套后缀体系,就能看懂 c 语言工程目录,理解 gcc 编译命令每一步输出的文件。
【常见问题】
问题 1 c 语言文件后缀为什么主源码使用 c
回答 1 c 语言文件后缀选择 c 是行业通用约定,编译器默认识别这个后缀,按照 c 标准语法编译源码,c 语言文件后缀使用 c 可以让 IDE 构建系统自动识别源码文件,不需要额外配置编译参数。
问题 2 c 语言文件后缀 h 头文件可以单独编译吗
回答 2 c 语言文件后缀对应的 h 头文件不能单独编译,h 文件是声明文件,依靠 c 语言文件后缀为 c 的源文件 include 引入之后,才会参与编译流程,单独编译 h 文件会出现大量符号缺失报错。
问题 3 修改 c 语言文件后缀之后代码会变吗
回答 3 修改 c 语言文件后缀不会改变代码内容,但是编译器识别规则会变化,如果把 c 后缀改成 cpp,编译器会切换成 c 加加语法解析,部分纯 c 代码会因为语法差异报错,也就是 c 语言文件后缀会影响编译解析方式。
【免责申明】
本文内容仅作为 c 语言编程基础知识科普,不同编译器 IDE 和操作系统对文件后缀识别规则存在差异,实际工程开发请参考对应工具官方文档,本文不构成工程开发方案推荐。


