整理于网上资料 http://blog.youkuaiyun.com/janders/article/details/611081 和
http://www.cnblogs.com/polestar/archive/2012/02/24/2366724.html
头文件的理论概述:
.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。
1)h文件作用:
1.方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明;
2. 使函数的作用域从函数声明的位置开始,而不是函数定义的位置(实践总结)
3 .提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。
2)h文件里应该有什么:常量,结构,类型定义,函数,变量申明。
3)h文件不应该有什么:变量定义, 函数定义。
头文件编写的基本规则:
- 防重入开关,也就是常见的 #ifndef… #define… #endif
- #include ,头文件里应该 include 所有该文件中所使用的其它接口头文件。这里有也有两层含义,一是说头文件应做到自包含,即使用头文件的用户不需要再为该头文件 include 其它头文件;二是从模块耦合内聚角度来说,头文件中本身不应该 include 太多其它头文件,一般就是通用数据类型定义, include 其它头文件意味着强耦合——引用了其它头文件中的类型定义,宏或是函数。
- 接口声明及注释,包括函数,结构体等,但不应该出现全局变量(全局变量的申明放在头文件中,定义不可放在头文件中,因为多个文件引用时会出现重定义错误),和 static 类型的接口(static类型接口只能在自己的文件中使用,没有必要在头文件中申明),这些都应该是放置在 C 文件中。函数的注释中应该包括功能说明,参数使用方法,可能的返回值,及其它注意事项。结构体的注释中应该包括每个成员变量所表示的含义。我们也提倡自注释,即通过合理的命名达到见名知意的效果。
C语言的存储类说明符有以下几个, 我来列表说明一下:
说明符 用法
Auto 只在块内变量声明中被允许, 表示变量具有本地生存期.
Extern 出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存期, 连接程序知道其名字.
Static 可以放在函数与变量声明中. 在函数定义时, 其只用于指定函数名,而不将函数导出到连接程序. 在函数声明中,表示其后面会有定义声明的 函数, 存储类为static. 在数据声明中, 总是表示定义的声明不导出到连接程序.
C99中规定, 所有顶层的默认存储类标志符都是extern
在.H文件中声明的函数,如果在其对应的.c文件中有定义,那么我们在声明这个函数时,不使用extern修饰符(这个是为了一个文件内函数的的定义顺序和调用顺序可能不一致,不如说现在只有一个.C文件,main函数调用一个子函数,但是这个子函数定义是在mian函数的下面,那这是编译器会报错的), 如果反之,则必须显示使用extern修饰符(使用别的.C里定义的函数)..这样,在C语言的.h文件中,我们会看到两种类型的函数声明. 带extern的,还不带extern的, 简单明了,一个是引用外部函数,一个是自己生命并定义的函数.
.h文件的顶层作用域,:顶层作用域就是从声明点延伸到源程序文本结束