C語言學習筆記 巨集定義

2021-10-02 23:41:26 字數 1490 閱讀 1568

#define 叫做巨集定義命令,它也是c語言預處理命令的一種。所謂巨集定義,就是用乙個識別符號來表示乙個字串,如果在後面的****現了該識別符號,那麼就全部替換成指定的字串。巨集定義是由源程式中的巨集定義命令#define完成的,巨集替換是由預處理程式完成的。

#define  巨集名  字串
#表示這是一條預處理命令,所有的預處理命令都以 # 開頭。巨集名是識別符號的一種,命名規則和變數相同。字串可以是數字、表示式、if 語句、函式等。

巨集定義是用巨集名來表示乙個字串,在巨集展開時又以該字串取代巨集名,這只是一種簡單粗暴的替換。字串中可以含任何字元,它可以是常數、表示式、if 語句、函式等,預處理程式對它不作任何檢查,如有錯誤,只能在編譯已被巨集展開後的源程式時發現。

巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起替換。

巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用#undef命令。

**中的巨集名如果被引號包圍,那麼預處理程式不對其作巨集代替。

巨集定義允許巢狀,在巨集定義的字串中可以使用已經定義的巨集名,在巨集展開時由預處理程式層層代換。

習慣上巨集名用大寫字母表示,以便於與變數區別。但也允許用小寫字母。

可用巨集定義表示資料型別,使書寫方便。

巨集定義表示資料型別和用 typedef 定義資料說明符的區別。巨集定義 只是簡單的字串替換,由預處理器來處理;而 typedef 是在編譯階段由編譯器處理的,它並不是簡單的字串替換,而給原有的資料型別起乙個新的名字,將它作為一種新的資料型別。

如下例

#define pin1 int *

typedef int *

pin2

;pin1 a, b;

pin2 c,d;

其中表示 a 是指向整型的指標變數,而 b 是整型變數;c和d均表示指向整型的指標變數。

由這個例子可見,巨集定義雖然也可表示資料型別, 但畢竟只是簡單的字串替換。在使用時要格外小心,以避出錯。

c語言允許巨集帶有引數。在巨集定義中的引數稱為「形式引數」,在巨集呼叫中的引數稱為「實際引數」,這點和函式有些類似。對帶引數的巨集,在展開過程中不僅要進行字串替換,還要用實參去替換形參。

形式為

#define 巨集名(形參列表) 字串
帶參巨集定義中,形參之間可以出現空格,但是巨集名和形參列表之間不能有空格出現。

在帶參巨集定義中,不會為形式引數分配記憶體,因此不必指明資料型別。而在巨集呼叫中,實參包含了具體的資料,要用它們去替換形參,因此實參必須要指明資料型別。

在巨集定義中,字串內的形參通常要用括號都括起來,包括嵌層括號,以避免出錯。

帶引數的巨集和函式很相似,但有本質上的區別:巨集展開僅僅是字串的替換,不會對表示式進行計算;巨集在編譯之前就被處理掉了,它沒有機會參與編譯,也不會占用記憶體。而函式是一段可以重複使用的**,會被編譯,會給它分配記憶體,每次呼叫函式,就是執行這塊記憶體中的**。

c語言學習筆記之巨集定義

1 巨集名的命名規範 全部大寫有多個單詞中間使用下劃線隔開 常用 以k開頭的駝峰標識 不常用 2 程式執行過程 源 編譯預處理 編譯 鏈結 執行 3 編譯預處理指令 在編譯前進行解析處理的指令 編譯預處理指令包括 1.巨集定義 define 1.1 不帶引數巨集定義 1.2 帶引數的巨集定義 2.條...

C語言學習筆記12 巨集定義與使用分析

在c語言中 define 是預處理器處理的單元實體之一 define 定義的巨集可以出現在程式的任意位置 define定義之後的 都可以使用這個巨集 定義巨集常量 巨集表示式被預處理器處理 直接對巨集進行文字替換 編譯器不知道巨集表示式的存在 預處理器不會對巨集定義進行語法檢查,巨集定義是出現的語法...

巨集定義 C語言基礎學習筆記

define include ifndef define maxszie 10000帶引數的巨集 define add x,y x y define plus x,y add x,y define add x,y x y 呼叫 plus plus a,b c 呼叫結果 就是按照順序巢狀 最終 c b...