结构体高级应用(变量位置 大小 位域 共用体)

目录

1.检测结构体的大小是否等于特定值

2.获取变量在结构体的位置

3.位域

4.结构体和共用体

5.结构体CRC全局变量校验

 

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.位域

形式:类型说明符 位域名:位域长度

作用:节省内存

说明:

  1. 一个位域必须存储在同一个字节中,不能跨两个字节。
  2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度。
  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读出的变量有没有错误,否则重新读取,还有恢复默认使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值