在建立了標頭檔案之後,只要把它的檔名用雙引號括起來寫在如下所示的指令裡就可以匯入它:
#include 「fishc.h」
如果沒有給出路徑名,編譯器將到當前子目錄以及當前開發環境中的其他邏輯子目錄裡去尋找標頭檔案。
為了消除這種猜測,在匯入自己的標頭檔案時可以使用相對路徑。如果標頭檔案與主程式檔案在同乙個子目錄裡,則可以這麼寫:
#include 「./fishc.h」
如果標頭檔案位於某個下級子目錄裡,那麼以下級子目錄的名字開頭:
#include 「includes/fishc.h」
最後,如果標頭檔案位於某個與當前子目錄平行的」兄弟」子目錄裡,則需要這麼寫:
#include 「../includes/fishc.h」
請務必注意,windows通常使用反斜槓作為路徑名裡的分隔符。
回到rational這個栗子,我們帶大家來進一步實現模組化程式設計。
rational.h標頭檔案包含rational類的宣告,但不包含這個類的實現**。
這種分割可能剛開始接觸的朋友覺得有點奇怪,但在實踐中非常普遍。
因為把介面(函式的原型)和實現(函式體的定義)分開是對**進行模組化的基本原則之一。
標頭檔案的重要性不僅體現在它們可以告訴編譯器某個類、結構或函式將有著怎樣的行為,還體現在它們可以把這些訊息告訴給程式設計師。
作為苦逼程式猿一枚,你只需看到函式的宣告就可以了解到你需要知道的一切:函式的名字,它的返回值型別和它的輸入引數的型別和數量。
知道了這些東西,你就可以使用那個函式了,而根本用不著關心它到底是如何工作的。
編譯器就不同了,它必須讀取某個類或函式的實現**。
作為乙個通用原則,應該把宣告放在乙個標頭檔案裡,把實現**放在乙個.cpp檔案裡。
現在我們就演示下rational這個程式如何分開和拼湊成乙個完整的程式。
剛才的示例程式還有乙個小小的問題需要解決,就是rationcal.cpp和main.cpp檔案都包含了rational.h標頭檔案。
這意味著rational.h類被宣告了兩次,這顯然沒有必要(如果它是乙個結構,宣告兩次還將導致編譯器報錯呢~)
解決方案之一是把其中乙個檔案裡的#include刪掉即可。這固然很容易可以解決的問題,但卻會給今後留下麻煩。。。。。。
當然我們在這裡提出是因為有更好的解決方案!
利用c++預處理器,我們可以讓標頭檔案只在這個類還沒有被宣告過的情況下才宣告它。
預處理器的條件指令
以前的課程中,我們曾建議大家注釋很多段**的話用預處理的方式,比起/* */要效果好:
#if 0
// 這裡有**
// 這裡有好多**
// 這裡有好多好多**
// 這裡有好多好多好多**
#endif
#ifndef love_fishc
#define love_fishc
#endif
這看起來好像沒什麼用,但事實卻並非如此。這段**的含義是:如果love_fishc還沒有定義則定義之,看出這有什麼作用了嗎?
#ifndef love_fishc
#define love_fishc
class rational;
#endif
如果love_fishc還沒有定義,這裡將發生兩件事兒:定義一次love_fishc,然後對rational類做出宣告等操作。
這樣一來,即使包含著這段**的檔案在某個專案裡被匯入了100次,rational類也只會被宣告一次,因為在第一次之後love_fishc就有定義!
作為一種固定模式,這裡使用的常量名通常與相應的檔名保持一致,把句點替換為下劃線。
於是,rational.h檔案將對應rational_h
012 命名空間和模組化程式設計
接下來我們將重點討論兩個相互關聯的簡單概念 把程式劃分成多個組成部分 即所謂的 模組 這是通過把程式 分散到多個檔案裡,等編譯程式時再把那些檔案重新組合在一起實現的。這個概念相比起c語言是c 裡新增加的東西,編寫的程式越多 編寫的程式越複雜,就越需要使用命名空間。只用乙個源 檔案來儲存程式的全部 是...
模組化程式設計
將乙個5元素陣列,右移n位,n從鍵盤輸入,首尾相接 例如 陣列中的元素為 那麼 n 3 的結果如下 資料是向右邊移三位,那麼,我轉化成先移一位的情況。因為當移一位的問題解決了,移動n位只需要將此過程迴圈n次即可 1.把a 1 放到臨時空間t t a 1 2.依次把前面元素的值放到後面的空間裡面.從後...
模組化程式設計小結
模組化程式設計,可以讓程式變得容易理解,結構更加清晰,下面小結一下如何進行模組化程式設計 本文以keil軟體進行舉例 1 將所需要的程式分為 c 和 h 兩類,其中 c 中用來實現程式,h 則用來宣告程式 2 在 c 的檔案中,包含所需的標頭檔案,如 include reg52.h 3 在宣告函式的...