預處理器技術可以確保標頭檔案多次包含仍能安全工作,它是從c語言繼承而來的。預處理器在編譯之前執行,可以部分改變我們所寫的程式。#include就是一項預處理功能,當預處理器看到#include 標記時就會將指定標頭檔案的內容代替#include。
c++程式還會用到的一項預處理功能是 標頭檔案保護符,標頭檔案保護符依賴於預處理變數。預處理變數有兩種狀態:已定義和未定義。
#define 把後面的名字定義為預處理器變數,常用大寫。
#ifndef if not define 如果沒有定義。就是如果後面的名字沒有被定義成預處理器變數,那麼這句話後所有的程式都將被執行,直到遇見#endif。
舉例:
假如我自己寫了兩個標頭檔案one.h,和two.h。其中one.h包括的是乙個類的定義;two.h由於也要用到這個類,所以這個標頭檔案裡面必然要有一行程式:#include「one.h」。
而我們的主程式裡面,開始必然要把我們自己定義的標頭檔案給加進去,必然應該有兩行程式:#include「one.h」和#include「two.h」,這樣實際上one.h這個標頭檔案被包含了兩次,那個類的也相當於定義了兩次,必然編譯時會出現錯誤,為了解決這個問題。在one.h裡應該加入這麼一段程式:
#ifndef one
#define one
//這裡應是one.h裡面本來應該有的**程式
#endif
這樣這個標頭檔案在主程式處理時只會被處理一次。因為:當主程式首先碰到這句::#include「one.h,時,由於是第一次處理one標頭檔案,one這個預處理器變數還沒有定義呢,所以會執行#define one這個語句,one變數被定義了,標頭檔案one中的**也會被執行了。當主程式碰到這句:#include「two.h」,由於two標頭檔案中,也有這麼一句:#include「one.h」,然後程式就會再次進入到one這個標頭檔案中執行,這是由於one這個變數在第一次執行one這個標頭檔案時已經被定義了,所以#ifndef one判斷失敗,不會執行後續的**了,也就不會在執行one標頭檔案中實際有用的**了。這樣保證了標頭檔案只會被處理一次。
因此應該在自己編寫的每個標頭檔案中都加上保護符,避免標頭檔案被多次包含。
參考文章
C 預處理器
偶爾翻c 的教材,看到了一些以前自己不太關注的角落。參考教材 c 大學教程 harvey m.deitel 和paul james deitel著。預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中 定義符號常量和巨集 程式 的條件編譯以及預處理指令的條件執行。對應的,預處理指令有 檔案包含命...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...