巨集定義的一些用法

2021-09-21 18:18:08 字數 1558 閱讀 1843

c及c++通過預處理器提供了一些語言功能, 最常用的有#include指令, 用於包含標頭檔案, 其他如#define及巨集定義, 也被稱為巨集替換, 當編譯器編譯到帶巨集定義的語句時, 會直接替換為定義語句.例如, 假如我定義有#define maxlength 100, 那麼, 在編譯器編譯到所有maxlength時則會自動替換為100.

巨集定義的形式如下:

#define 定義名 替換文字

比較簡單的用法則為定義一些在程式中比較常用的常量, 以節省記憶體. 當然根據巨集定義的特性, 我們也可以衍生出一些比較特殊的用法, 如圖

我定義了乙個名為print的巨集, 並可對其傳入引數, 它將被替換為乙個控制台輸出引數的語句, 實際上有點像定義了乙個用於控制台輸出的方法, 對其呼叫如圖

執行程式即可輸出字串hello world, 如圖

實際上, 在編譯器編譯到print(「hello world」)時, 將會被替換為cout << 「hello world」 << endl;

那麼很顯然, 巨集定義與函式呼叫還是有所不同的, 比如當我們傳入帶有計算表示式的實參時, 它得出的結果將與函式呼叫的結果有所不同.如圖:

定義了乙個巨集和乙個函式, 都是用於選擇兩個引數中更大的數(巨集定義中必須對三目表示式用括號進行包裹, 否則會因為運算子優先順序而發生錯誤), 首先我們呼叫巨集進行輸出, 得到輸出結果如圖

因為語句被替換為(i++) > (j++) ? (i++) : (j++), 所以無論輸出i還是j 其值都將被自增兩次, 只不過由於++運算子的特性, 它在當值被使用後才進行自增, 所以控制台輸出為2而不是3. 再用max函式對i++, j++進行呼叫, 得到輸出結果如圖

由於函式呼叫只傳遞值, 所以當i, j 還未自增時已被傳遞, 得到輸出結果為1.

當然, 巨集定義還有其他有趣的用法, 如圖

將#置於巨集定義引數前, 則會將傳入引數轉換為字串形式, 對其呼叫如圖

則控制台將輸出hello world, 如圖

巨集定義還可以對引數進行連線, 如圖

此時會將傳入的兩個引數進行連線, 此處並不是以字串拼接, 該方法一般用於建立標記, 呼叫如圖

則控制台將輸出12, 如圖

巨集定義的一些特殊用法

1 有參巨集定義中 的用法 definestr str str 用於把巨集定義中的引數兩端加上字串的 比如,這裡str my name 會被替換成 my name 一般由任意字元都可以做形參,但以下情況會出錯 str 這樣,編譯器不會把 當成str 的引數。str 同上,編譯器不會把 當成str的引...

C語言巨集定義的一些用法

do while 0 在巨集定義中合理使用do while 0 可以更規範地使用巨集定義 沒有使用do while 0 前 define led on int main void 多了個分號 使用do while 0 define led on dowhile 0 int main void whi...

vxworks一些巨集定義位址

ram high adrs記憶體起始位址 boot執行位址 ram low adrs vxworks執行位址 user reserved mem使用者保留記憶體區域 熱啟動可以保留除錯資訊 local mem local adrs記憶體起始位址 加入元件memory show routine就可用s...