1. 程式人生 > >C語言基礎之巨集定義(附程式碼)

C語言基礎之巨集定義(附程式碼)

C語言基礎之巨集定義

巨集定義:是C語言提供的三種預處理功能的其中一種,這三種預處理包括:巨集定義、檔案包含、條件編譯。巨集定義和操作符的區別是:巨集定義是替換,不做計算,也不做表示式求解。#define預處理指令可以用來定義巨集。

巨集定義的形式,分為帶引數和不帶引數的巨集定義:
1. 不含引數的巨集定義:

#define  識別符號  字串

例如: #define PI 3.14
這裡的識別符號是巨集的名稱,字串可以是常數、表示式、格式串。

這裡需要注意以下幾點:
1)巨集名稱通常全由大寫英文字母構成,裡面不能有空格,用巨集替換數字的時候不要使用賦值操作符,編譯器會把程式中所有巨集名稱替換成它所代表的數字;
2)巨集定義是用巨集名來表示一個字串,在巨集展開時,又以該字串取代巨集名,這只是一種簡單的代換,字串中可以是任何字元、常數、表示式,預處理程式不對它作任何檢查。如有錯誤,只能在編譯已被巨集展開後的的源程式時發現;
3)巨集定義不是說明或語句,在行末不需加分號,若加了分號則連分號一起置換。;
4)巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用#undef命令;

  1. 帶有引數的巨集定義:
#define  巨集名(引數表) 字串

例如: #define M(y) y*y+3
它的作用是指定識別符號M(y) 來代替表示式y*y+3。在編寫源程式時,所有的y*y+3都可以由M(y) 代替。而對源程式作編譯時,將先由預處理程式進行巨集代換,即用 y*y+3表示式去置換所有的巨集名M(y),然後再進行編譯。

這裡需要注意以下幾點:
1)巨集的引數不一定代表數字,所以巨集引數沒有型別,巨集可以有多個引數,這個時候需要用逗號把不同引數分隔開, 編譯器採用二次替換的方式處理帶引數的巨集;
2)巨集不能使用自己的儲存區實現和函式之間的資料傳遞,巨集沒有返回值;
3)因為巨集沒有返回值,所以不能保證優先計算巨集內部的操作符,所有能當作數字使用的巨集必須寫在一對小括號裡;

測試程式碼:
這裡寫圖片描述
測試結果為:
這裡寫圖片描述

另外,可以在編譯命令中使用 -D 選項指定巨集名稱代表的數字。

測試程式碼如下:
這裡寫圖片描述
測試結果為:
這裡寫圖片描述

小知識:
#是一個巨集操作符,它可以把一個巨集的引數轉換成字串字面值;##也是一個巨集操作符,它可以把一個代表識別符號的巨集引數和其他內容連線,得到一個新的識別符號。

以下是我的個人公眾號,主要作為C/C++語言技術分享使用,歡迎新增交流:
這裡寫圖片描述