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 先存入暫存變數,避免副作用問題。