c語言提供多種預處理功能,主要處理#開始的預編譯指令,如巨集定義(# define),檔案包含(# include),條件編譯(# ifdef)等(以*開頭的都是預處理命令)。
條件編譯是c語言中預處理部分的內容,它是編譯器編**時最先處理的部分,。條件編譯裡面有判斷語句,如#if,#else,#endif。它的意思是如果巨集條件如果符合,就編譯這段**,否則,編譯器就忽略這段**而不編譯。
if語句則不然,if是c語言中的關鍵字,它根據表示式的計算結果來決定執行哪個語句,它裡面的每個分支都編譯過了的。
簡單點講,條件編譯是根據巨集條件選擇性編譯語句,它是編譯器在編譯**時完成的;
條件語句是根據條件表示式選擇性地執行語句,它是在程式執行時執行的。
意為將乙個巨集引數輸出時,對其進行字串化處理,即在其兩端各加乙個雙引號。
()##是連線符,用來將兩個token連線為乙個token。這裡連線的物件token,不一定是巨集的變數。
1).定義乙個結構體時,同時定義該種型別的變數。
2).先定義乙個結構體型別,在定義該型別的變數。
3).用型別定義符typedef給結構體命別名,再用這個別名定義結構體變數。
1):結構體變數名.成員名
2):結構體指標變數->成員名
1).執行時間不同:typedef在編譯階段有效,由於在編譯階段,typedef有型別檢查的功能,#define發生在預處理階段,只進行監督的字串替換,不會進行任何檢查
2).功能有差異:typedef用來定義型別的別名,定義與平台無關的資料型別,與struct的結合使用等;#define不只是可以為型別取別名,還可以定義常量,變數,編譯開關等作用域不同:#define沒有作用域的限制,只要是之前預定義過的巨集,在此後的程式中都可以使用,而typedef有自己的作用域
二者修飾指標型別時,作用不同
因為沒有稱作為「位段指標」型別的變數。
乙個位段必須儲存在同一儲存單元中,不能跨兩個單元。如果第乙個單元空間不能容納下乙個位段,則該空間不用,而從下乙個單元起存放該位段 。
結構體型別的作用域
1) 定義在函式外面:全域性有效(從定義型別的那行開始,一直到檔案結尾)
2) 定義在函式(**塊)內部:區域性有效(從定義型別的那行開始,一直到**塊結束)
不允許對結構體進行自身遞迴定義。
結構體內可以包含別的結構體。
只有在定義結構體變數時才會進行記憶體空間分配
學習Linux C程式設計之預處理與結構體
1 巨集定義的位置及作用域?巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束,也可以用 undef 命令終止。2 檔案包含命令 與 的區別 使用 表示在包含檔案包含目錄中去查詢 包含目錄是由使用者在設定環境時設定的 而不在源檔案目錄去查詢。使用 表示首先在當前的源檔案目錄中查詢,若未找...
預處理,結構體
q 巨集定義的定義和型別。a 巨集定義是由源程式中的巨集定義命令完成的,巨集代換是由預處理程式自動完成的,在 c語言中,巨集定義分為有參和無參兩種。無參巨集巨集名後不帶引數,其定義的一般形式為 define 識別符號 字串 帶參巨集的引數為形參,其一般形式為 define 巨集名 形參表 字串。q ...
預處理和結構體2
q 結構體的作用及其優勢。a struct將相關聯的資料打包成乙個整體,方便使用,我們將多種資料組合起來的整體稱為結構體。結構體可以很好的將需要傳送的內容儲存在乙個整體中,同時結構體也可以壓縮函式引數個數。q 結構體和陣列的比較。a 同 都由多個元素組成 各元素在記憶體中的儲存空間是連續的 異 陣列...