2.9头文件
头文件为声明提供了一个集中存放的位置,正确使用头文件带来两个好处:
1、保证所有文件使用给定实体的同一声明。
2、当声明需要修改时只用更新头文件。
一、 头文件用于声明而非定义,定义只能出现一次,而声明可以出现多次。有三个例外:
1、头文件可以定义类。
2、可以定义值在编译时就已经知道的const对象。
3、inline内联函数。
二、 定义在头文件中的const对象,当const变量用常量初始化时,const变量就是一个常量表达式,const对象要成为常量表达式,初始化就必须为编译器可见。
为了让多个文件使用相同的常量值,const对象就必须为多文件可见。这样const对象就放到了头文件中。
但是,每个变量只能定义一次,定义分配存储空间,每次对改变量的引用都关联到同一存储空间。因为const对象默认为文件局部变量,所以合法。常量是全局可见性的,所以要在头文件,但是const对象是文件局部变量,只存在于头文件中,别的文件不能访问,所以合法。
反之,const应和其他变量一样,在头文件声明,别的文件定义。
习题解答:
1、判断下列语句那些是声明,哪些是定义,请解释原因。
extern int ix=1024;
int iy;
extern int iz;
extern const int &ri;
答:第一第二是定义,第三第四声明。2、下列声明和定义那些应该放在头文件中?那些应该放在源文件中?解释原因。
int var;
const double pi=3.14;
externint total=225;
constdouble sq2=squt(2.0);
答:第一第三第四应放在源文件中,第二应放在头文件中。
2.9.2预处理器
include是C++预处理器的一部分,预处理器处理程序源代码在编译器之前运行。include只接受一个参数:头文件名。预处理器用指定头文件的内容替代#include部分。
一、头文件经常需要其他头文件:
头文件在定义的过程中经常要用到其他的头文件,比如各种类。因此就有可能出现同一个头文件被包含多次的情况。所以我们必须保证同一头文件背包含多次而不会引起重复定义。这样我们就要使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文件的情况下再次处理头文件。
二、避免多重包含:
预处理器变量的名字在程序中必须是唯一的,因此预处理器变量名经常使用全大写,两个预处理器:
1、#define 接受一个名字,并将定义该名字为预处理器变量。
2、#ifndef 检测指定预处理器变量是否定义。如未定义,则在其后的所有指示都被处理。直至出现#endif。
#ifndef C___primer___Header_h
#define C___primer___Header_h
int b()
{
int q=2,w=3;
return q+w;
}
int a=b();
int q=3;
//int g=a;
//const int b();
extern const int &g;
const int s=5;
#endif
#ifndnf先测试预处理器变量是否被定义,如未定义,定义该变量,并处理接下来的指示。直至#endif。当下一次包含该头文件时,先执行#ifndef,如果定义了,就忽略剩余部分。
二、使用自定义头文件:
文件名在<>中,认为该头文件为标准头文件,文件名在""中,认为是非系统文件。