多文件程序设计中头文件若干问题
2010-12-21 晴
首先说明的是头文件可以不存在的,因为用#include语句将其包含进源文件时,只是简单地将其内容复制入源文件中。它起的作用是避免程序员手工复制,并使代码更为简洁。所以多文件程序设计可以看成多源文件程序设计。
多文件程序设计中,文件之间的问题,无非就是共享数据的问题。这些共享数据可以是全局变量、全局函数、自定义数据类型等。
头文件中的全局变量与全局函数。头文件中的防重定义宏,只是保证同一个源文件中不会多次包括这个头文件。但这个头文件可以被多个源文件所包含的。所以头文件中的数据可能会在多个源文件中出现。对于全局变量与全局函数这是不允许的。也就是说头文件中不能定义全局变量与全局函数。但某个源文要用到别的源文件中定义的全局数据时,要提前声明(说白了就是要扩展全局数据的作用域,变量用extern TypeName Var;函数直接声明)。程序员当然可以一个一个地声明,但不觉得很麻烦吗?所以这么声明应该写到头文件中,再要扩展作用域的时候,#include一下就OK了。
头文件中的自定义数据类型定义。头文件中还会经常出现自定义数据类型的定义部分。自定义数据以类为例。这样的做的原因是:第一,当源文件中要定义一个类对象时,必须先有类的定义。第二,类的定义可以出现在多个源文中。
补充。还要说明的是,类的成员函数现实与静态变量的定义是不能放在头文件的,因为这些数据有全局函数与全局变量的性质。对于内联函数比较特殊,它可以出现在头文件中。
下面文章转载至 http://blog.youkuaiyun.com/micro0807/archive/2007/12/14/1935016.aspx
:
关于多文件程序结构的头文件设计的若干问题研究
通过一段时间的编程实践,对较大的项目组织有一些心得了,那天又看到钱能的<<C++程序手机教程>>中关于头文件设计的建议,于是总结了以下几点头文件设计方法及文件结构组织方法:
1.怎么组织头文件和源文件的结构。
本文中的头文件专指.h文件,源文件专指.c或.cpp文件,模块指完成一定功能的程序文件的组合。每模块仅包含唯一的源文件及唯一的同名头文件。该头文件中可包含其他头文件。
头文件遵循“界面头文件”的思想,充分表达该模块的功能。用于声明extern全局函数,声明extern全局变量,类型定义,包含其他头文件等。
源文件用于声明static静态函数,定义函数,定义全局变量,定义static静态全局变量。
2.全局变量的声明和定义问题。
全局变量可以使用extern关键字在多个模块中声明,但是只能且必须在其中一个模块中定义。比较好的一个解决方案是,将全局变量extern声明到一个公共头文件中,要使用该全局变量的模块都include它,然后在main所在的源文件中定义这个全局变量。这个方案可以比较好地兼顾模块独立性并解决变量重复定义的问题。
3.全局常量的声明和定义问题。
全局常量在声明时就必须定义,所以其声明和定义实际上是同一个问题。每个模块都可以最多定义一次同一个全局常量。全局常量也可以放在公共头文件中,每个模块都include它。
4.静态全局变量和常量的声明和定义问题。
静态全局变量和常量的作用域仅在模块内部,使用static关键字在本模块的源文件中声明。
5.函数的声明和定义问题。
全局函数在头文件中声明,而在源文件中定义;静态函数的声明和定义均在源文件中。
6.保护性的预编译代码问题。
头文件要使用#ifndefine…#define…#endif做保护,以免被多次包含。
后来又向程序设计方法学的老师求证了一下,如果项目中确实能严格按照这几条组织文件,可以很好的解决模块独立和头文件互相包含的问题