預處理也稱為預編譯,為編譯做預備工作,主要進行**文字的替換工作,用於處理#開頭的指令,其中預處理器產生編譯器的輸出。同乙個處理階段所進行的工作只是純粹地替換與展開,沒有任何計算功能。
c/c++標頭檔案的ifndef/define/endif的作用:如果乙個專案中存在兩個c檔案,而這兩個c檔案都include了同乙個標頭檔案,當編譯時,這兩個c檔案要一同編譯成乙個可執行檔案,可能會產生大量的宣告衝突。而解決的辦法是把頭檔案的內容都包含在#ifndef 和 #endif 中。
#include,編譯器先從標準庫路徑開始搜尋filename.h,使得系統檔案呼叫較快。而對於#include'filename.h' 編譯器先從使用者的工作路徑開始搜尋filename.h,然後尋找系統路徑,自定義檔案較快。
1)巨集定義主要是在預處理命令,不是語句,在進行巨集定義時,不能以分號結束。主要做的是在編譯錢做字元替換工作,需要對**進行展開,相對函式呼叫的方式,會存在較多的冗餘**。由於還沒編譯,所以無法進行型別檢查。只有在編譯的時候才能檢查型別是否匹配。
2)由於優先順序的不同,使用巨集定義時,可能會存在***,所以要需要注意括號的使用。
3) 無法單步除錯。
4)使用巨集無法操作類的私有資料成員。
5)考慮到可能存在資料溢位的問題,更加規範的寫法是使用長整型,即ul型別。
含引數的巨集與函式的的區別:
1)函式中的實參和形參都要定義型別,兩者的型別要求一致,如果不一致,會進行型別轉換。巨集不存在型別問題,巨集名無型別,它的引數也無型別。
2)函式呼叫時,實現求出實參表示式的值,然後帶入。帶參的巨集只是進行簡單的字元替換。
3)巨集替換不占用執行時間,而函式呼叫則占用執行時間。
4)函式呼叫是在程式時處理的,需要分配臨時的記憶體單元,巨集展開是在編譯時執行的,在展開時不分配記憶體單元,也不進行值得傳遞,也沒有返回值的概念。
5)巨集展開後源程式會變得很長,因為每展開一次使程式內容增長,而函式呼叫不使源程式變長。
巨集來代表簡單的表示式比較合適。
列舉和define的不同:
1) 列舉常量是實體中的一種,而巨集定義不是實體。
2)列舉可以一次定義多個常量,巨集只能定義乙個。
3)列舉常量屬於常量,有型別。巨集定義不是常量,沒有型別。
4)#define巨集常量在預編譯階段進行文字的替換工作,列舉常量在編譯的時候確定其值。
5)一般在編譯器裡,可以除錯列舉常量,但是不能除錯巨集常量。
typedef 和 define的區別:
typedef 和 define 都是替物件取乙個別名,以此來增強程式的可讀性。
1)原理不同。
#define是c語言中定義的語法,它是預
處理命令,在預處理時進行簡單而機械的字串替換,不做型別檢查。
typedef是關鍵字,在編譯時處理,有型別檢查的功能。在自己的作用域內給乙個已經存在的型別取乙個別名,但是不能在函式定義裡面使用識別符號typedef。用typedef 定義陣列、指標、結構等型別將帶來很大的方便,可以增強程式的可讀性。
2)功能不同。
typedef用來定義型別的別名,這些型別不僅可以包含內部型別,還包括自定義型別,可以使型別易於記憶。#define 不只是可以為型別取乙個別名,還可以定義常量、變數、編譯開關等。
3)作用域的不同。#define沒有作用域的限制,只要是之前預定義過的巨集,在以後的程式中都可以使用,而typedef 有自己的作用域。
4)對指標的操作不同。
巨集和列舉及typedef
巨集和列舉及typedef 巨集和列舉及typedef三者有相似的功能,但又有各自獨特的用途和特點,以下主要介紹三者的用法和注意事項。1.列舉 a.列舉的目的值提高程式的可讀性。b.列舉型別的宣告是指用一組符號名稱來代替一組整數常量。c.列舉常量都是整數型別的。d.在宣告列舉型別時如果沒有對符號名稱...
列舉 共用體 typedef與巨集定義
c 語言列舉型別 實際問題中,有些變數的取值被限制在一定範圍內。例如,乙個星期內只有七天,一年 只有十二個月,乙個班每週有六門課程等。c 語言提供了一種列舉 enum 型別,可以列出所有可能的取值。定義形式為 enum 變數名 這些值也稱為列舉元素。注意最後的分號 不能少。例如,列出乙個星期有幾天 ...
typedef跟列舉變數。
typedef enum errorstatus 這個 怎麼解釋?這個語句的作用是為資料型別 enum 定義乙個別名errorstatus,這樣以後定義變數時就寫errorstatus a 就可以了,而不用寫較長的enum a 了.typedef的用於其實很簡單,但是當typedef後面跟個列舉變數...