目录
1.检测结构体的大小是否等于特定值
例如预留结构体空间256,结构体定义少于该字节或者多余该字节都应该报错提示,不够的字节使用预留变量,应用于modbus或者其他全局变量空间划分
/* 检测结构体的大小是否等于特定值 */
#define SIZE_OF_TYPE_EQUAL_TO(type, size) \
static inline char size_of_##type##_equal_to_##size() \
{ \
char __dummy1[sizeof(type) - size]; \
char __dummy2[size - sizeof(type)]; \
return __dummy1[-1] + __dummy2[-1]; \
}
2.获取变量在结构体的位置
作用:结构体默认自动对齐,例如3个char,四字节对齐就会补齐一个,为了防止该偏移出现而浪费空间,计算偏移来防止对齐问题
/* 获取变量在结构体的位置*/
#define get_variable_index(TYPE, member,ITYPE,index)\
{ \
*index = (ITYPE)(&(((TYPE*)0)->member));\
}while(0)
3.位域
形式:类型说明符 位域名:位域长度
作用:节省内存
说明:
- 一个位域必须存储在同一个字节中,不能跨两个字节。
- 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度。
- 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
struct bit_text_{
uint8_t bit_test0 : 1;
uint8_t bit_test1 : 1;
uint8_t bit_test2 : 1;
uint8_t bit_test3 : 1;
uint8_t bit_test4 : 1;
uint8_t bit_test5 : 1;
uint8_t bit_test6 : 1;
uint8_t bit_test7 : 1;
};
4.结构体和共用体
公用一个内存,可以将部分数据的字节按照CHAR类型提取出来,非常好用
typedef union tagGlobal
{
struct A;
char acCharBuf[sizeof(A)];
}GLOBAL_S;
5.结构体CRC全局变量校验
例如预留128空间参数,给状态参数
其中120为状态参数,4字节用于CRC校验,4字节用于校验大小
CRC结构体成员作用:
1.当变量发生变化的时候检测出,然后存储的flash中,或者进行其他响应
2.系统启动的时候,先检测flash读出的变量有没有错误,否则重新读取,还有恢复默认使用