q:巨集定義的定義和型別。
a:巨集定義是由源程式中的巨集定義命令完成的,巨集代換是由預處理程式自動完成的,在
c語言中,巨集定義分為有參和無參兩種。無參巨集巨集名後不帶引數,其定義的一般形式為:
#define
識別符號 字串;帶參巨集的引數為形參,其一般形式為:
#define
巨集名(形參表) 字串。
q:無參巨集的用途及其注意點。
a:無參巨集常用於對程式中反覆使用的表示式,例:
#define m (y*y+3*y)
;該例中即用指定識別符號
m來代替
m (y*y+3*y)
。巨集定義時需注意優先順序的問題,確保定義內容滿足所需。
巨集定義是用巨集名表示字串巨集展開時以該字串取代巨集名,是簡單的替換,寫在函式之外,如有錯誤,只能在編譯已被巨集展開後的源程式時被發現。
q:帶參巨集的用途及其注意點。
a:帶參巨集呼叫時,用實參代替實參,巨集名和形參表之間不能有空格出現。
q:帶參巨集定義和自定義函式的區別。
a:在帶參巨集定義中,形參不分配記憶體單元,不需作型別定義;巨集定義中實參有具體的值,要用它們代替形參,必須作型別說明。即帶巨集參中,只是符號代換,不存在值傳遞問題。巨集定義中的形參是識別符號,而巨集呼叫中的實參可以是表示式。
q:檔案包含中」」和
<>的區別。
a:檔案包含中,用
<>
表示在包含檔案目錄中去查詢,而不是在源檔案目錄中查詢;用
」」則表示首先在當前的源檔案目錄中查詢。檔案包含允許巢狀,即在乙個被包含的檔案中可以包含另乙個檔案。
q:條件編譯的三種形式和各自功能。
a:第一種形式:
#ifdef 識別符號
程式段1
#else
程式段2
#endif
它的功能為若識別符號被定義過,則編譯程式段1,否則編譯程式段2,
else
可以不存在。
第二種形式:
#ifndef 識別符號
程式段1
#else
程式段2
#endif
它的功能與第一種相反,即若識別符號未被定義過,則編譯程式段1,否則編譯程式段2,
else
可以不存在。
第三種形式:
#if 常量表示式
程式段1
#else
程式段2
#endif
它的功能為若常量表示式為真,則編譯程式段1,否則編譯程式段2,
else
可以不存在。
q:巨集定義中的#和
##.a:巨集定義中
#的功能是將其後的巨集參進行字串化操作,
##則是連線符,用於連線兩個
token
使之連線為乙個
token,
不一定用於巨集的變數。
預處理與結構體
巨集定義 檔案包含 條件編譯1 巨集定義不是說明或語句,不需要在結尾加上分號 2 巨集定義必須寫在函式之外,其作用域是巨集定義命令起到源程式結束,如需要終止可使用 undef命令 3 預處理程式不對巨集定義做任何檢查,如有錯誤,只能在編譯被巨集定義展開後的源程式時發現1 巨集會在編譯器在對源 進行編...
結構體對齊預處理指令
方式一 n可以取以下5個數中的任意乙個 1,2,4,8,16 來自定義結構體成員的對齊方式 pragma pack n 這裡放置結構體 pragma pack 取消自定義位元組對齊方式方式二 n可以取以下5個數中的任意乙個 1,2,4,8,16 來自定義結構體成員的對齊方式 pragma pack ...
預處理和結構體2
q 結構體的作用及其優勢。a struct將相關聯的資料打包成乙個整體,方便使用,我們將多種資料組合起來的整體稱為結構體。結構體可以很好的將需要傳送的內容儲存在乙個整體中,同時結構體也可以壓縮函式引數個數。q 結構體和陣列的比較。a 同 都由多個元素組成 各元素在記憶體中的儲存空間是連續的 異 陣列...