1、地址对齐:在嵌入式设备中,常常涉及到地址对齐等要求
#define ALIGN(addr, size) (((addr) + ((size)-1u)) & (~((size)-1u)))
将地址addr按照size向上对齐,size必须为2的n次方。
2、求数组大小:
#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
3、编译时条件检查:!!两次取反的作用:将指定内容转换为bool处理,true或者false
/* 检查endAddr,如果大于blockAddr,就会编译报错*/
#define CHECK_ADDR_OVER_RUN(endAddr, blockAddr) \
__attribute__((unused)) static inline void block_addr_overrun(void) \
{ \
(void)sizeof(char[1 - 2*(int)(!!((endAddr) > (blockAddr)))]); \
}
检查原理:
如果endAddr > blockAddr,两次取反后,结果为1,然后数组的大小会是1-2*1=-1,编译器报错,数组长度是负数
如果endAddr < blockAddr,那么不会有编译报错,同时因为属性为unused,该函数也不会被实际链接,不会导致编译的版本增大