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的跳轉,比如:
intfoo()
dosomething...;
if(error)
dosomething...;
end:
free
(ptr);
return0;
}
替換為
intfoo()
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當中...