C++ 头文件完全解析

一,头文件的作用与意义。

C ++ 编译器采用的是分离编译模式。在一个项目中,有多个源文件存在,但是它们总会有一些内容是相同的,如使用相同的用户自定义类型,使用了相同的全局变量等。因此,将这些内容抽取出来放到头文件中,然后在提供给各个源文件包含,就可以避免这些内容的重复书写,提高编程效率和代码安全性。立头文件的目的主要是:提供全局变量,全局函数的声明或提供公用数据类型的定义,从而实现分离变异或代码复用。

例如,将全局变量和全局函数放到头文件中是最常见的,头文件中的全局变量需要使用extern声明。在其他cpp文件中使用#include idef.h即可将头文件的内容完全拷贝到cpp中,头文件,其实它的内容跟CPP 文件中的内容是一样的,都是C ++ 的源代码。但头文件不用被编译。把所有的函数声明全部放进一个头文件中,当某一个cpp 源文件需要它们时,它们就可以通过一个宏命令“ #include” 包含进这个CPP 文件中,从而把它们的内容合并到CPP 文件中去。


idef.h //头文件

extern int a;

int show(int x,int y);


判断头文件中的内容是否合适的简单准则:规范的头文件应该被多个源文件包含而不引发编译错误概括的说,头文件有如下三个作用:

(1)加强类型检查,提高代码得类型安全性。C ++ 中使用头文件,对自定义类型的安全也是非常重要的。虽然,在语法上,同一个数据类型(如一个)在不同的源文件中书写多次是允许的,程序员认为他们是同一个自定义类型。但是,由于用户自定义类型不具有外部连接特性,编译器并不关心该类型的多个版本之间是否一致,这样会导致逻辑错误的发生。 

2)减少代码的重复书写,提高编写和修改程序的效率。 
在程序开发的过程中,对某些数据类型或者接口进行修改是难免的,使用头文件,只需要修改头文件中的内容,就可以保证修改在所有源文件中生肖,从而避免了繁琐易错的重复修改

           3)提供保密和代码重用的手段。          头文件也是C ++ 代码虫蛹即只中不可缺少的一种手段,在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件的接口声明来调用库功能,而不必关心接口是怎么实现的,编译器会从库中提取相应的代码 

         总之,为了模块化和结构清晰,C ++实现分离式编译的方式是使用头文件,将全局变量,函数与自定义类型放在头文件中,不同文件通过包含所依赖的头文件,即可实现不同文件共用同一变量,函数的目的

二,头文件中变量声明与定义解析

一个符号(变量,普通函数,对象),在整个程序中可以被声明多次,但却要且仅要被定义一次。一个程序包含多个文件,在每个文件里声明且只声明一次一个符号,但整个程序中只能定义一次。

1.普通变量。

变量的声明与定义不一样,定义变量和声明变量的区别在于定义会产生内存分配的操作,在没有声明变量时直接定义也属于声明

int a; int b = 1; 都是定义,如果放到头文件中,被别的文件包含后会再次定义,引发编译错误。

extern int c; 全局声明,放在头文件中。

2.函数

函数在头文件中的声明与在普通文件中一样,函数首部加分号即可。

通过“定义只能有一次”的规则,我们很容易可以得出,头文件中应该只放变量和函数的声明,而不能放它们的定义。但是有四个例外:

放在头文件中而不会重复定义的原因是他们的作用域只在他们所在的文件中,当引用时,貌似共享同一变量,实际上被包含时,文件重新定义了一个一模一样的变量,但并不会产生错误,即同名不同域

          1.Const ststic 对象;

           首先解决常量的疑问,常量在头文件中可声明为EXTERN和普通常量,如果没有的extern,则其必须初始化

           const int a = 1;

           extern const int a = 1; 所有包含文件中定义一个= 1;

            extern const int a; 引用的文件中定义,且只能被其中某个文件定义一次。

           然后对于静态,当然不能加extern,其即可在头文件中定义也可只声明,且差别仅在于有没有初始值,如果没有赋值,其将等于0。

          static int a;      

          static int a = 1; 

          2. 内联函数可以在头文件中允许多次定义;

          3. 类的定义,注意类的成员函数如果要定义在头文件中,必须定义在类体内(隐式内联)。虽然内联函数可以多次定义,但是类不可以,如果类包含类,ç 类要用到类和类时只需要且只能包含类的头文件,可通过IFNDEF ,#定义自动决定。

不能在C ++ 的头文件中放置变量的定义,因为变量只能定义一次,为什么类的定义可以放在头文件中呢在类的定义部分我们又得知,类定义只是定义了一种类型,也即说明了一个类,并没有实际定义类的对象,定义的是类,定义类描述的是新的类型,而描述新类型并不会开辟内存空间去存储这样一种新类对象,因此类定义可以存放在头文件中。

4.函数模板和类模板成员函数的定义通常放在头文件中。

5.类的定义中,类的static变量是实现单例模式的重要条件。

三,避免相互包含

           的#include尽量写到CPP文件里。两个文件在.H文件里相互包括,就会产生编译错误,而两个文件在.c的文件互相包括,不会就有该问题,因此在.H文件包括就要避免互相包含的问题,而的.cpp文件就不需要考虑 .H 文件中要用到其他头文件中的变量时(一般只会引用其他头文件中的类),这时可以将其头文件包含进来,但是两个头文件不可以相互包含,解决方法是在头文件中进行对方类的声明,在CPP 中包含对方头文件。

        当子系统含有多个头文件且文件结构清晰时,将某些头文件放在一个头文件中可以实现代码重用,也是代码具有较好的阅读性。为了避免重复引用C++也提供了#ifdef #define及#endif来避免重复包含带来的错误,有的编译器也支持#program once 来避免重复包含。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值