多文件程序设计中头文件若干问题
2010-12-21
晴
首先说明的是头文件可以不存在的,因为用#include语句将其包含进源文件时,只是简单地将其内容复制入源文件中。它起的作用是避免程序员手工复制,并使代码更为简洁。所以多文件程序设计可以看成多源文件程序设计。
多文件程序设计中,文件之间的问题,无非就是共享数据的问题。这些共享数据可以是全局变量、全局函数、自定义数据类型等。
头文件中的全局变量与全局函数。头文件中的防重定义宏,只是保证同一个源文件中不会多次包括这个头文件。但这个头文件可以被多个源文件所包含的。所以头文件中的数据可能会在多个源文件中出现。对于全局变量与全局函数这是不允许的。也就是说头文件中不能定义全局变量与全局函数。但某个源文要用到别的源文件中定义的全局数据时,要提前声明(说白了就是要扩展全局数据的作用域,变量用extern
TypeName Var;函数直接声明)。程序员当然可以一个一个地声明,但不觉得很麻烦吗?所以这么声明应该写到头文件中,再要扩展作用域的时候,#include一下就OK了。
头文件中的自定义数据类型定义。头文件中还会经常出现自定义数据类型的定义部分。自定义数据以类为例。这样的做的原因是:第一,当源文件中要定义一个类对象时,必须先有类的定义。第二,类的定义可以出现在多个源文中。
补充。还要说明的是,类的成员函数现实与静态变量的定义是不能放在头文件的,因为这些数据有全局函数与全局变量的性质。对于内联函数比较特殊,它可以出现在头文件中。
下面文章转载至
http://blog.csdn.net/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做保护,以免被多次包含。
后来又向程序设计方法学的老师求证了一下,如果项目中确实能严格按照这几条组织文件,可以很好的解决模块独立和头文件互相包含的问题
分享到:
相关推荐
C++面向对象程序设计课程辅导三:一个C++语言程序由若干个程序文件和头文件所组成,每个头文件中通常带有用户类型的定义、符号常量的定义、函数的声明等内容,每个程序文件由若干个函数定义所组成,其中必有一个并且...
3.1.7 消息循环 3.1.8 窗口过程 3.1.9 消息的处理 3.1.10 声音文件的播放 3.1.11 WM_PAINT消息 3.1.12 WM_DESTROY消息 3.2 Windows编程中的若干难点 3.2.1 究竟是谁调用谁 3.2.2 队列消息和非队列消息 3.2.3 ...
由于采用了函数模块式的结构, C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。 在C语言中可从不同的角度对函数分类。 1. 从函数定义的角度看,函数可分为库函数和用户...
本文是讲座《单片机C 语言程序设计》的结束篇,为了帮助大家更好地掌握前面所学的知识,我们将归纳性地介绍初学者用C 语言编辑PIC 单片机实用程序时应具备的思维方法和基本知识,并通过下面的实例进行小结,以期对...
132 产品宣传屏幕保护程序 4.5 DirectShow程序设计 cc实例133 音频捕捉 cc实例134 视频捕捉 第5章 文件系统 5.1 文件的基本操作 cc实例135 创建和删除文件夹 cc实例136 把文件删除到回收站中 ...
4.5 DirectShow程序设计 cc实例133 音频捕捉 cc实例134 视频捕捉 第5章 文件系统 5.1 文件的基本操作 cc实例135 创建和删除文件夹 cc实例136 把文件删除到回收站中 cc实例137 ...
4.5 DirectShow程序设计 cc实例133 音频捕捉 cc实例134 视频捕捉 第5章 文件系统 5.1 文件的基本操作 cc实例135 创建和删除文件夹 cc实例136 把文件删除到回收站中 cc实例137 ...
4.5 DirectShow程序设计 实例133 音频捕捉 实例134 视频捕捉 第5章 文件系统 5.1 文件的基本操作 实例135 创建和删除文件夹 实例136 把文件删除到回收站中 实例137 清空回收站 5.2 查找文件 实例138 搜索...
4.5 DirectShow程序设计 实例133 音频捕捉 实例134 视频捕捉 第5章 文件系统 5.1 文件的基本操作 实例135 创建和删除文件夹 实例136 把文件删除到回收站中 实例137 清空回收站 5.2 查找文件 实例138 搜索...
C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定...
AppWizard是一个原代码生成工具,是计算机辅助程序设计软件,Winmain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对...
实例189 在程序中使用自定义文件格式 242 实例190 简单的文件加密解密 244 5.7 其他 246 实例191 在DELPHI中控制Word 246 实例192 带日志的程序 247 实例193 获取窗口文本 248 实例194 判断文件是否...
C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定...
在C++程序设计中,在一个源文件中定义某个函数,然后在另一个源文件中使用该函数,这是一种非常普遍的做法。但是,如果定义和调用一个函数模板时也采用这种方式,会发生编译错误。 下面的程序由三个文件组成:func.h...
第一部分 程序员必读 第一章 对程序错误的处理 在我们开始介绍Microsoft Windows应该提供的许多特性之前,我们首先...关于Unicode的问题,我在本书的每一章中几乎都要讲到,而且本书中给出的所有示例应用程序都是...
第7章 选择和分支结构程序设计 86 实例068 判断偶数 87 实例069 判断字母是否为大写 88 实例070 检查字符类型 89 实例071 求最低分和最高分 90 实例072 模拟自动售货机 91 实例073 计算工资 93 实例074 平方和值判断...
自从计算机问世以来,程序设计就成了令人羡慕的职业,程序员在受人宠爱之后容易发展成为毛病特多却常能自我臭美的群体。 如今在Internet上流传的“真正”的程序员据说是这样的: (1) 真正的程序员没有进度表,只有...
语音识别程序的核心部分即采用合适的算法来识别不同的语音信号,在特定人语音识别算法中,对于孤立词语语音识别而言,最为简单的方法是采用DTW(Dynamic Time Warping,动态时间弯折)算法,该算法基于动态规划)...