C语言头文件组织理论及实践--基于裸机
参考链接:https://www.cnblogs.com/clover-toeic/p/3728026.html
一、头文件作用
每个源文件是一个模块,头文件为使用该模块的接口提供接口。基于裸机的C程序比较特殊,分为两大部分:main.c文件和驱动模块程序源文件。main.c文件调用其他模块中的程序实现预期的功能。
二、头文件组织原则
- 头文件只包含作者想要暴露的接口及接口相关的其他内容,尽量降低头文件的体积
- 在头文件中不应有变量定义、函数定义,只能有宏、类型(typedef/struct/union/enum等)、函数声明、变量声明。
- 头文件名与源文件名相同
- 说明性头文件可以无对应的源文件。如基本类型定义文件(typedef char int8等,external,inline等别名)
- 使用宏保护
- 头文件中有详尽的注释,从应用角度说明接口
三、头文件包含原则
- 头文件包含的头文件取决于自身的需要,而非包含该头文件的源文件,与上章内容的第一条相同
- 保证用户只要包含此头文件,无需手动包含其他头文件。即使用头文件中的接口时,只需包含一个头文件
- 与上条相似,包含一个头文件时不应产生编译错误
四头文件组织实践
- core_board.h包含核心板相关的宏定义,如引脚别称,中断优先级,及外设相关参数(如串口波特率等)
- config.h主要用于包含C语言相关的类型定义,如基本类型别称、C语言关键字别称等
- main.h包含hardware.h和其他全局参数。这些全局参数主要描述关于主函数需要暴露给其他模块的数据
- n_module.h包含外设实现的功能及使用外设过程中需要用到的数据
- 所有的.c文件均需包含config.h文件和main.h文件
【注1】全局变量的使用原则
1)若全局变量仅在单个源文件中访问,则可将该变量改为该文件内的静态全局变量;
2)若全局变量仅由单个函数访问,则可将该变量改为该函数内的静态局部变量;
3)尽量不要使用extern声明全局变量,最好提供函数访问这些变量。直接暴露全局变量是不安全的,外部用户未必完全理解这些变量的含义。
4)设计和调用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题。
【注2】编程技巧:
1.若不确定类型、宏定义或函数声明所在头文件具体路径,可在源文件中再次定义或声明,编译器会以redefined警告或conflicting错误给出类型、宏定义或函数声明所在头文件路径
2.对于函数库(包括标准库和自定义的公共宏及接口)的头文件,可将其加入到一个通用头文件中