需求:在编译时检查struct数据结构的大小
思路a:预编译时检测,不一定支持sizeof,且数据结构类型未知。
思路b:运行时检测,效率问题。
思路c:在编译时检测。
编译时检测
Linux内核(在include/linux/kernel.h)里面已经有相关的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的编译参数,也不会有警告;
因此,BUILD_BUIG_ON这个宏展开后等效于
(void)sizeof(char[1])
(void)sizeof(char[-1])
网友评论