TIL: ARRAY_SIZE in Linux kernel

from net/mac80211/sta_info.c, define at include/linux/kernel.h

__must_be_array: 檢查 a 是否為 array,當 a 為 array 時,會因為 &(a)[0] 變成 pointer,而讓 __same_type 產生 0 的結果,反之如果 a 為 pointer,因為 &(a)[0] 仍然是 pointer, __same_type 回傳 1 而導致 BUILD_BUG_ON_ZERO 產生編譯 error,從而檢查傳入的 object 是否為 array:

BUILD_BUG_ON_ZERO: 當 BUILD_BUG_ON_ZERO 的值為 true 的時候,編譯時會發出 error (error: negative width in bit-field ‘’)。但值為 false 時會產生 value 0:

__same_type: 根據不同的編譯器有不同的版本,這邊以 gcc 為例,使用的 gcc 的 builtin-function __builtin_types_compatible_p , 當兩者 type 相同時回傳 1,否則回傳 0:

 

範例程式碼:

編譯結果:

 




如果你覺得這篇文章不錯,歡迎打賞

BTH: 35QooNA82isrmQLmpEnqXpJoxeZmaPubPf

ETH:0x4cf61fea5EA842D202B85158d8b5e239C872De46

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料