嵌入式学习笔记 - 头文件重复包含问题
先举一个例子:
几乎在每个.C文件中我们定义变量的时候通常需要用到 uint32_t, uint16_t, unint8_t等字符来定义变量类型,例如 uint16_t adc_value;
显然uint16_t 这个字符并非C语言本身能够识别的字符,它属于用户在某一个文件中的一个宏定义或者类型重定义。
下图为STM32 HAL库函数中关于此变量字符的重定义文件,位于stdint.h头文件中。
通过一步步查看头文件包含关系,发现几乎每个外设模块头文件当中都递归包含了此头文件stdint.h
而main.h 中又包含了每一个外设头文件,
而且Hal库自身生成的模块初始化以及配置.H文件中又都引用了main.h文件,包括用户将要自己编写的.c, .h 文件,都会包含main.h
所以就stdio.h 头文件来说就会被引用无数次,造成重复引用相互包含以及最终引起代码文件过大的问题,但是C语言在定义头文件的时候都加了条件编译如下图,如果之前未定义过,那么整个文件会被编译,如果之前已经定义过,那么整个文件就会被舍弃不会被编译,不论你重复包含多少次永远只有一次被编译添加进代码,所以不必担心重复引用问题,话虽如此,在程序编写上最好还是要遵循一定的逻辑,这样代码的可读性逻辑性看起来更强。