头文件(Header File):
头文件的使用主要体现在两个方面,一个是重用(即多次使用),另一个是共用。
类似于标准库函数,在头文件里面应该模块化地给出一些函数或功能。另外还应该包括独立实现这些函数或功能的常量、变量和类型的声明。
//shape.h
struct circle
{
double r;
};
//shape.cpp
const double pi=3.14159265358;
double perimeter_of_circle(double r)
{
return 2*pi*r;
}
double area_of_circle(double r)
{
return pi*r*r;
}
//main.cpp
#include<iostream>
#include "shape.h"//包含编写好的shape.h
using namespace std;
double perimeter_of_circle(double);
double area_of_circle(double);
int main()
{
circle c={2};
cout<<"Perimeter of circle "<<perimeter_of_circle(c.r)<<endl;
cout<<"Area of circle "<<area_of_circle(c.r)<<endl;
return 0;
}
编写好了shape.h头文件,以后用到计算圆的周长或面积的时候,就不需要重新编写函数了,只需要包含这个头文件就行了。
由于头文件是为了重用,所以在一个复杂的程序中,头文件可能会被间接地重复包含。如果头文件里面都是函数声明,那问题还不大。如果头文件里面有函数定义,那么就会出现函数被重复定义的错误,程序将无法运行。可以采用函数声明和定义分离的方式:把所有的声明都放在shape.h中,把所有的定义放在shape.cpp中。注意必须在shape.cpp中包含shape.h,否则在编译连接时会发生错误。在使用时仍然包含shape.h,但由于函数的定义并不在该头文件中,所以就不会被重复定义了。
#include是一条编译预处理命令。编译预处理命令不会在运行时体现出来,因为它是写给编译器的信息,而不是程序中需要执行的语句。编译预处理命令不仅仅只有#include一条,在C++中,所有以#开头的命令都是编译预处理命令,比如#if、#else、#endif、#ifdef、#ifndef、#undef和#define等等。
当编译器遇到了#include命令后,就把该命令中的文件插入到当前的文件中。不难想象,main.cpp文件实质上包含了shape.h文件中的所有语句。所以它能够顺利调用shape.h文件中的各个函数。
#include命令有#include <文件名>和#include "文件名"两种写法。
C++已经有一些编写好的头文件(比如标准函数库等等),它们存放在Include文件夹里。当使用#include <文件名>命令时,编译器就到这个文件夹里去找对应的文件。所以包含C++提供的头文件时,应该使用尖括号。
相反地,#include "文件名"命令则是先在当前文件所在的目录搜索是否有符合的文件,如果没有再到Include文件夹里去找对应的文件。
C++标准规定,包含C++提供的标准头文件或系统头文件时应使用尖括号,包含自定义头文件时可使用双引号。