您的位置:首页 > 编程语言 > C语言/C++

C++中“头文件”的定义和使用

2016-03-27 15:00 309 查看
我们知道只用一个源代码文件来保存程序的全部代码是可行的,但那会给编辑修改工作带来诸多不便。我们可以借助于C++的预编译器和编译器的能力把一个复杂的应用程序划分成多个不同的文件,而仍保持它在内容和功能上的完整。

 

头文件可以细分为系统头文件和自定义头文件。 

1、系统头文件:定义的都是系统级功能,正式因为有了它们,C++代码才可以在某种特定的系统上运行。如果你想在你的程序使用这些功能,就必须把相应的头文件包括到你的程序里来。 

在#include指令里,系统头文件的文件名要放在尖括号里给出,这是告诉编译器:应该到“标准的”地点寻找这个文件:#include <stdio.h>

2、自定义头文件:在#include指令里,自定义头文件的文件名要放在双引号里给出:#include “fishc.h”

头文件是一些以.h作为扩展名的标准文本文件。

一般情况下,都应该把自定义的头文件和其余的程序文件放在同一个子目录里,或者在主程序目录下专门创建一个子文件夹来集中存放它们。

 

你可以用头文件来保存程序的任何一段代码,如函数或类的声明,但一定不要用头文件来保存它们的实现(即函数或类的定义)!

与标准的C++源代码文件相比,在头文件里应该使用更多的注释。

绝大多数头文件是通用型的,不隶属于任何特定的程序,所以至少把它的用途和用法描述清楚。 

应该在注释里说明的内容包括:

创建日期,文件用途,创建者姓名,最后一次修改日期,有什么限制和前提条件等等。

另外头文件里的每一个类和函数也应该有说明。

 提示 

虽说头文件可以用来保存任意代码片段,但典型的做法是只用它们来保存函数声明、用户自定义类型数据(结构和类)、模板和全局性的常量。

如果你有一个程序需要多次调用一个或一组函数,或是你有一个或一组函数需要在多个程序里调用,就应该把它们的声明拿出来放到一个头文件里。

头文件应该只包含最必要的代码,比如只声明一个类或只包含一组彼此相关的函数。

把接口(函数的原型)和实现(函数体的定义)分开是对代码进行模块化的基本原则之一。

 

头文件的重要性不仅体现在它们可以告诉编译器某个类、结构或函数将有着怎样的行为,还体现在它们可以把这些消息告诉给程序员。

作为一个通用原则,应该把声明放在一个头文件里,把实现代码放在一个.cpp文件里。

 

就是rationcal.cpp和main.cpp文件都包含了rational.h头文件。

这意味着rational.h类被声明了两次,这显然没有必要(如果它是一个结构,声明两次还将导致编译器报错呢~)

解决方案之一是把其中一个文件里的#include删掉即可。这固然很容易可以解决的问题,但却会给今后留下麻烦。。。。。。

 

当然我们在这里提出是因为有更好的解决方案!

利用C++预处理器,我们可以让头文件只在这个类还没有被声明过的情况下才声明它。



预处理器的条件指令:

程序段处理的好方法,请参考:

 http://blog.csdn.net/duan19920101/article/details/50939452

#if 0

// 这里有代码

// 这里有好多代码

// 这里有好多好多代码

// 这里有好多好多好多代码

#endif

 

#ifndef LOVE_FISHC

#define LOVE_FISHC

#endif

 

这看起来好像没什么用,但事实却并非如此。这段代码的含义是:如果LOVE_FISHC还没有定义则定义之,看出这有什么作用了吗?

 

#ifndef LOVE_FISHC

#define LOVE_FISHC

class Rational{ … };

#endif

 

如果LOVE_FISHC还没有定义,这里将发生两件事儿:定义一次LOVE_FISHC,然后对Rational类做出声明等操作。

这样一来,即使包含着这段代码的文件在某个项目里被导入了100次,Rational类也只会被声明一次,因为在第一次之后LOVE_FISHC就有定义!

 

作为一种固定模式,这里使用的常量名通常与相应的文件名保持一致,把句点替换为下划线。

于是,rational.h文件将对应RATIONAL_H

 

命名空间其实就是由用户定义的范围,同一个命名空间里的东西只要在这个命名空间有独一无二的名字就行了。

因此,如果某个程序有许多不同的头文件或已编译文件,它们又各自声明了许多的东西,命名空间可以为它们提供保护。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++