C++中头文件(通常以.h或.hpp为扩展名)和源文件(通常以.cpp,.cxx或.cc等为扩展名)是组成C++项目的主要组成部分。
1. 使用头文件的原因和好处
之所以在 C++ 中要使用头文件,有两个原因:
其一,是分离代码的声明与实现。
这主要源于C++这一面向对象语言的一大特点——封装性,把全局变量和全局函数的声明和类的定义保存在头文件中,而类的成员函数及全局函数的具体实现代码则写在源文件中。通过使用这种方式保证代码的隐私性。也就是说,使用类的人不用知道类的具体实现,只要知道如何使用就可以。
其二,是减小引用其他类,全局变量及全局函数的声明的代码体量。
C++ 程序的编译过程中,同一个项目可能有多个源文件(.cpp),而这些源文件是分别单独编译的。也就是说,在编译其中一个文件时,编译器并不知道其它文件中定义的内容。所以在使用其他源文件中内容的时候,要事先声明。把这些声明写在头文件,用时只需要include头文件,而不是include整个源文件(包括类的具体实现代码),这将减少编译器的工作量和代码的体量。
2. 引用头文件的方式
头文件的引用方式有两种:
#include <系统文件>
#include "自定义头文件"
其中头文件可以写.h扩展名,或者不写扩展名均可。
如下写法都可以:
#include <iostream>
或
#include <iostream.h>
3. 头文件的布局
一般编写头文件,需要有以下部分组成:
防卫式头尾
由于编译器在处理include头文件时,是将整个头文件的内容复制一份嵌入引用它的源文件中进行编译,所以可能会出现嵌套引用同一个文件的情况,多次引用同一个头文件会产生重复定义的编译错误。为避免这种错误,规范的头文件的写法是在头文件的开头和结尾加上防卫式头尾,其形式如下:
#ifndef __DATE_CLASS_H__
#define __DATE_CLASS_H__
……
#endif //__DATE_CLASS_H__
前置声明
有时候类声明前需要事先声明全局变量全局函数,会把这些声明写在类声明前。
类声明
就是在class <类名> {。。。};中定义的类的成员变量及成员函数的声明,全部内容都写在头文件里。
类定义
标准的写法是把类定义的内容放在源文件(.cpp)中,但是开源项目盛行的今天,也有些开源项目为了方便程序员使用,将所有代码都写在头文件中,可以直接以include头文件的方式使用,减少了编译环境不同造成的额外编译调试的工作。这中间的取舍还要由程序员根据项目内容自己权衡把握。