關於巨集的一些內容的總結

2021-09-08 04:04:00 字數 1419 閱讀 8384

1. 為什麼巨集定義裡經常出現 do while (0) 

answer:

用一句話概括就是:使用dowhile(0)構造後的巨集定義不會受到大括號、分號等的影響,總是會按你期望的方式呼叫執行。

比如#define foo(x) i++; i--

如下呼叫

foo(wolf);

就會被擴充套件為

i++; i--;

但是如果這樣呼叫

if(!feral)

foo(wolf);

那麼擴充套件後就是

if(!feral)

i++;

i--;

不符合原意了。

那麼為什麼不用大括號直接把巨集包圍起來呢?例如:

#define foo(x)

考慮如下情況:

if(!feral)

foo(wolf);

else

bin(wolf);

擴充套件後為:

if(!feral) ;

else

bin(wolf);

就有語法錯誤了。

所以,linux和其它**庫里的巨集都用do/while(0)來包圍執行邏輯,因為它能確保巨集的行為總是相同的,而不管在呼叫**中使用了多少分號和大括號。

其他 do while (0) 的作用包括:

1. 使用break來代替goto的跳轉,比如:

int

foo()

dosomething...;

if(error)

dosomething...;

end:

free

(ptr);

return0;

}

替換為

int

foo()

dosomething...;

if(error)

dosomething...;

}while(0

);

free

(ptr);

return0;

}

2. 避免變數作用域的衝突,在 do{}while(0) 定義變數

3. 可以定義空的巨集(避免警告)

#define emptymicro do{}while(0) 

關於巨集的一些說明

巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串。掌握 巨集 概念的關鍵是 替換 一切以替換為前提。預處理器是先於編譯器執行的 例 define pi 3.14 ...

關於platform driver的一些巨集知識

我在寫platform驅動的時候參考了一些linux已有的platform driver 發現了一些我不知道的知識點在這裡和大家分享一下。一 巨集module platform driver 在platform device.h 中定義 我們繼續追蹤 module driver,在device.h中...

關於token的一些內容

token,就是令牌,最大的特點就是隨機性,不可 一般黑客或軟體無法猜測出來。那麼,token有什麼作用?又是什麼原理呢?token一般用在兩個地方 兩者在原理上都是通過session token來實現的。當客戶端請求頁面時,伺服器會生成乙個隨機數token,並且將token放置到session當中...