需求:在編譯時檢查struct數(shù)據(jù)結(jié)構(gòu)的大小
思路a:預(yù)編譯時檢測,不一定支持sizeof,且數(shù)據(jù)結(jié)構(gòu)類型未知。
思路b:運(yùn)行時檢測,效率問題。
思路c:在編譯時檢測。
編譯時檢測
Linux內(nèi)核(在include/linux/kernel.h)里面已經(jīng)有相關(guān)的macro解決這個問題。
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
我們可以改裝此宏定義:
#define BUILD_BUG_ON(condition) ((void)sizeof(char[condition? 1:-1]))?
具體的原理是:(void)1,這個語句即使使用了 -Wall的編譯參數(shù),也不會有警告;
因此,BUILD_BUIG_ON這個宏展開后等效于
(void)sizeof(char[1])
(void)sizeof(char[-1])