关于C语言程序中.h文件的总结

1. 头文件用途

头文件的用途主要包括:
1) 声明函数原型;
2) 宏定义;
3) 类型定义(包括结构体类型等)
总结为一点即:避免在多个地方重复写同一段声明和定义的代码。实际是将该工作交给了编译器处理。


2. 同名.h文件的头包含问题

在代码的工程中,即使是在不同功能模块的源代码中,也应该避免使用相同的文件名,特别是.h文件的文件名。虽然这些.h文件是在不同的路径下的,但在一个较大的工程中,很可能会存在编译某一部分代码时,头文件的搜索路径同时包括这这些同名.h文件所在的路径,而这些.h文件的文件名又是相同的。因此如果些.h文件中有相同的类型定义,那么在编译时就会报出类型定义冲突等错误,而且这种错误往往很难定位原因。以下以common.h文件为例说明:
这里写图片描述
如上图所示,在加入module2之前,工程中只有module1这一块的代码,file4.c中头包含了common.h文件,此时编译链接正常。加入module2后,由于module2中也含有一个名为common.h的头文件(虽然路径与module1中common.h的路径不一样),若module1的makefile中,头文件的搜索路径既包括了module1的路径也包括module2的路径,此时编译就容易报file4.c中类型冲突错误。这种错误往往很难发现,因为在没有加module2时,module1编译是成功的,而加入module2时却又并没有修改module1中的代码。
避免这种问题的一个简单方法就是,不要出现同名文件,可以将上述两个common.h的文件名分别修改为module1_common.h和module2_common.h。


3. 头文件中包含其他头文件的问题

在头文件中包含其他头文件(个人称其为“嵌套头包含”)会存在以下3个负面影响:
1)可能会存在类型定义冲突,并且这种编译错误往往很难定位;
2)由于一层嵌套一层,会造成头包含关系很混乱;
3)由于编译时是将.h文件中内容拷贝到#include处,因此嵌套头包含会造成编译时文件很大,编译速度慢;
因此,尽量在.c文件中包含头文件,不要在一个头文件中包含其他的头文件,除非以下两种情况:
1)该头文件中需要使用的宏定义或者类型类型定义是在其他文件中定义的,此时必须头包含定义了这些定义的头文件;
其他多个地方需要包含同一批头文件,且这些头文件本身不存在冲突(一般是存在功能依赖的模块所需要的头文件),此时可以将这些头文件包含在一个.h文件中,这样其他需要这些头文件的地方只需要头包含这一个.h文件即可。


4. 头文件写法

在写头文件时应该在文件开始处加上#ifndef语句,后面一般用大写的文件名作为宏名,这样可以避免头文件被重复包含。例如common.h文件写法

#ifndef _COMMON_H
#define _COMMON_H
...(.h文件实际内容)
#endif  /* _COMMON_H */
展开阅读全文

没有更多推荐了,返回首页