萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心精髓:帶型別檢查的 min/max 巨集設計解析

Linux 核心中的 min/max 巨集

Linux 核心實作了一套帶嚴格型別檢查的 min/max 巨集,設計精巧值得深入理解。

帶型別檢查的版本

#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; })

你可能會覺得 (void)(&_x == &_y) 毫無意義——它確實不執行任何運算。那麼存在意義何在?

巧妙型別檢查原理

C 語言無法直接寫 typeof(_x) == typeof(_y) 比較型別。核心團隊利用編譯器特性:兩個不同型別的指標比較會產生警告。例如:

char *p; int *q; p == q; // 編譯警告

當 _x 和 _y 型別不同時,其指標型別也不同,&_x == &_y 觸發編譯警告,在編譯期提醒開發者傳入不匹配型別。

簡單版本與其陷阱

核心也有簡單實作:

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

但此版本有隱藏問題——參數可能被求值多次。例如:

min(++a, ++b) // 展開後 a、b 各遞增兩次!

帶型別檢查版本用 typeof 先存入暫存變數,避免副作用問題。

copyright © 萬盛學電腦網 all rights reserved