国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

學習園地:Linux系統內核中判斷大小的宏

2024-07-26 00:37:30
字體:
來源:轉載
供稿:網友
 

Min和Max宏:

/** min()/max() macros that also do* strict type-checking.. See the* "unnecessary" pointer comparison.*/#define min(x,y) ({ /typeof(x) _x = (x); /typeof(y) _y = (y); /(void) (&_x == &_y); /_x < _y ? _x : _y; })#define max(x,y) ({ /typeof(x) _x = (x); /typeof(y) _y = (y); /(void) (&_x == &_y); /_x > _y ? _x : _y; })/** ..and if you can't take the strict* types, you can specify one yourself.** Or not use min/max at all, of course.*/#define min_t(type,x,y) /({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })#define max_t(type,x,y) /({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })

不是感覺跟我們用的有些不一樣啊:

(void) (&_x == &_y);

(void) (&_x == &_y)這句話本身都執行程序來講完全是一句廢話,它的作用在于,本身我們無法做這樣的操作typeof(_x)==typeof(_y),所以故意判斷他們2個的地址指針是否相等,顯然是不可能相等,但是如果_x和_y的類型不一樣,其指針類型也會不一樣,2個不一樣的指針類型進行比較操作,會拋出一個編譯警告。也就是說char *p; int *q; 然后p==q;,這個判斷因為一個是char*一個是int*,會在編譯時產生一個warning。巧妙就巧妙在這里。

由于內核是很多開發著一起開發的,其中還有一些其他的實現,就跟我們平常用的一樣:

#define min(a,b) (((a) < (b)) ? (a) : (b))

試想:

min(++a,++b) ==> ((++a)<(++b))?(++a):(++b)

是不是就有問題了,傳入的參數被加了兩次。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临安市| 黄大仙区| 山丹县| 兴化市| 宜昌市| 黄骅市| 红河县| 始兴县| 峨眉山市| 历史| 天津市| 芜湖市| 垣曲县| 舒兰市| 哈巴河县| 灌云县| 广宗县| 东兰县| 舞钢市| 富阳市| 紫金县| 奇台县| 政和县| 来宾市| 汉中市| 阳城县| 临洮县| 肥乡县| 平利县| 德安县| 龙胜| 敦化市| 拜城县| 潼关县| 青神县| 揭西县| 五峰| 靖远县| 七台河市| 东莞市| 崇义县|