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

发布于:2023-01-21 ⋅ 阅读:(425) ⋅ 点赞:(0)

目录

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读出的变量有没有错误,否则重新读取,还有恢复默认使用


网站公告

今日签到

点亮在社区的每一天
去签到