C++ 编写头文件
我们可以在函数体中定义我们的类,但是这样的类并不方便我们的管理,所以我们一般把类定义在函数体外,同时要注意在各个指定的源文件中可能只有一处该类的定义,而且如果要在不同文件中使用同一个类,类的定义就要保持一致。
为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在的头文件应该与类的名字一样。例如,库函数string类应该在名为string.h的头文件中定义。
头文件中通常包含一些只能定义一次的实体,例如const,constexpr变量。
头文件有时需要调用其他头文件的功能,例如一个类中可能需要string成员,因此要调用string.h。
注意:头文件一旦改变,相关源文件必须重新编译以获得更新后的声明。
预处理器:
确保头文件多次包含仍能工作的常用技术为预处理器,他由C++从C语言处继承。预处理器是在编译之前执行的一段程序,可以部分的改变我们所写的程序。
C++程序还会用到一项预处理功能是头文件保护符,其依赖于预处理变量,预处理变量有已定义和未定义两种状态。
#define把一个名字设为预处理变量。
#ifdef当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真。一旦检查结果为真,则执行后续操作直到遇到#endif为止。这些功能能有效防止重复包含的发生。

第一次包含Sales_data.h时,#ifndef为真,预处理器将顺序执行后面的操作知道遇见#endif。此时预处理变量SALES_DATA_H的值将变为已定义,而且Sales_data.h也将被拷贝到我们的程序中来。后面如果在一次包含Sales_data.h,则#ifndef为假,编译器则会忽略#ifndef到#endif的部分。
注意:预处理变量无视C++作用域的规则。
整个程序的预处理变量包括头文件保护符必须唯一,通常做法是基于头文件中类的名字来构建保护符的名字,以确保唯一性,一般我们用全大写来定义预处理变量的名字。
注意:不管你的程序需不需要保护,我们都应该习惯性的加上保护。