標頭檔
每個C++/C程式通常分為兩個檔案。一個檔案用於儲存程式的聲明(declaration),稱為標頭檔。另一個檔案用於儲存程式的實現(implementation),稱為定義(definition)檔案。
C++/C程式的標頭檔以“.h”為尾碼,C程式的定義檔案以“.c”為尾碼,C++程式的定義檔案通常以“.cpp”為尾碼(也有一些系統以“.cc”或“.cxx”為尾碼)。
1.1 著作權和版本的聲明
著作權和版本的聲明位於標頭檔和定義檔案的開頭(參見樣本1-1),主要內容有:
(1)著作權資訊。
(2)檔案名稱,標識符,摘要。
(3)目前的版本號,作者/修改者,完成日期。
(4)版本曆史資訊。
/*
* Copyright (c) 2001,老妖工作室
* All rights reserved.
*
* 檔案名稱:filename.h
* 檔案標識:見組態管理計劃書
* 摘 要:簡要描述本檔案的內容
*
* 目前的版本:1.1
* 作 者:輸入作者(或修改者)名字
* 完成日期:2001年7月20日
*
* 取代版本:1.0
* 原作者 :輸入原作者(或修改者)名字
* 完成日期:2001年5月10日
*/
樣本1-1 著作權和版本的聲明
1.2 標頭檔的結構
標頭檔由三部分內容組成:
(1)標頭檔開頭處的著作權和版本聲明(參見樣本1-1)。
(2)預先處理塊。
(3)函數和類結構聲明等。
假設標頭檔名稱為 graphics.h,標頭檔的結構參見樣本1-2。
【規則1-2-1】為了防止標頭檔被重複引用,應當用ifndef/define/endif結構產生預先處理塊。
【規則1-2-2】用 #include <filename.h> 格式來引用標準庫的標頭檔(編譯器將從標準庫目錄開始搜尋)。
【規則1-2-3】用 #include “filename.h” 格式來引用非標準庫的標頭檔(編譯器將從使用者的工作目錄開始搜尋)。
【建議1-2-1】標頭檔中只存放“聲明”而不存放“定義”
在C++ 文法中,類的成員函數可以在聲明的同時被定義,並且自動成為內嵌函式。這雖然會帶來書寫上的方便,但卻造成了風格不一致,弊大於利。建議將成員函數的定義與聲明分開,不論該函數體有多麼小。
【建議1-2-2】不提倡使用全域變數,盡量不要在標頭檔中出現象extern int value 這類聲明。
// 著作權和版本聲明見樣本1-1,此處省略。
#ifndef GRAPHICS_H // 防止graphics.h被重複引用
#define GRAPHICS_H
#include <math.h> // 引用標準庫的標頭檔
…
#include “myheader.h” // 引用非標準庫的標頭檔
…
void Function1(…); // 全域函式宣告
…
class Box // 類結構聲明
{
…
};
#endif
樣本1-2 C++/C標頭檔的結構
1.3 定義檔案的結構
定義檔案有三部分內容:
(1) 定義檔案開頭處的著作權和版本聲明(參見樣本1-1)。
(2) 對一些標頭檔的引用。
(3) 程式的實現體(包括資料和代碼)。
假設定義檔案的名稱為 graphics.cpp,定義檔案的結構參見樣本1-3。
// 著作權和版本聲明見樣本1-1,此處省略。
#include “graphics.h” // 引用標頭檔
…
// 全域函數的實現體
void Function1(…)
{
…
}
// 類成員函數的實現體
void Box::Draw(…)
{
…
}
樣本1-3 C++/C定義檔案的結構
1.4 標頭檔的作用
早期的程式設計語言如Basic、Fortran沒有標頭檔的概念,C++/C語言的初學者雖然會用使用標頭檔,但常常不明其理。這裡對標頭檔的作用略作解釋:
(1)通過標頭檔來調用庫功能。在很多場合,原始碼不便(或不準)向使用者公布,只要向使用者提供標頭檔和二進位的庫即可。使用者只需要按照標頭檔中的介面聲明來調用庫功能,而不必關心介面怎麼實現的。編譯器會從庫中提取相應的代碼。
(2)標頭檔能加強型別安全檢查。如果某個介面被實現或被使用時,其方式與標頭檔中的聲明不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程式員調試、改錯的負擔。