需求:在編譯時檢查struct數(shù)據(jù)結(jié)構(gòu)的大小
思路a:預(yù)編譯時檢測袭景,不一定支持sizeof挡育,且數(shù)據(jù)結(jié)構(gòu)類型未知。
思路b:運行時檢測称簿,效率問題扣癣。
思路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])