C++ 編寫頭文件
我們可以在函數(shù)體中定義我們的類,但是這樣的類并不方便我們的管理,所以我們一般把類定義在函數(shù)體外,同時要注意在各個指定的源文件中可能只有一處該類的定義,而且如果要在不同文件中使用同一個類,類的定義就要保持一致。
為了確保各個文件中類的定義一致,類通常被定義在頭文件中,而且類所在的頭文件應該與類的名字一樣。例如,庫函數(shù)string類應該在名為string.h的頭文件中定義。
頭文件中通常包含一些只能定義一次的實體,例如const,constexpr變量。
頭文件有時需要調用其他頭文件的功能,例如一個類中可能需要string成員,因此要調用string.h。
注意:頭文件一旦改變,相關源文件必須重新編譯以獲得更新后的聲明。
預處理器:
確保頭文件多次包含仍能工作的常用技術為預處理器,他由C++從C語言處繼承。預處理器是在編譯之前執(zhí)行的一段程序,可以部分的改變我們所寫的程序。
C++程序還會用到一項預處理功能是頭文件保護符,其依賴于預處理變量,預處理變量有已定義和未定義兩種狀態(tài)。
#define把一個名字設為預處理變量。
#ifdef當且僅當變量已定義時為真,#ifndef當且僅當變量未定義時為真。一旦檢查結果為真,則執(zhí)行后續(xù)操作直到遇到#endif為止。這些功能能有效防止重復包含的發(fā)生。

第一次包含Sales_data.h時,#ifndef為真,預處理器將順序執(zhí)行后面的操作知道遇見#endif。此時預處理變量SALES_DATA_H的值將變?yōu)橐讯x,而且Sales_data.h也將被拷貝到我們的程序中來。后面如果在一次包含Sales_data.h,則#ifndef為假,編譯器則會忽略#ifndef到#endif的部分。
注意:預處理變量無視C++作用域的規(guī)則。
整個程序的預處理變量包括頭文件保護符必須唯一,通常做法是基于頭文件中類的名字來構建保護符的名字,以確保唯一性,一般我們用全大寫來定義預處理變量的名字。
注意:不管你的程序需不需要保護,我們都應該習慣性的加上保護。