3、struct与union 对于struct 结构体和union共联体在嵌入式领域是使用得非常频繁的,一些可编程芯片提供的寄存器库都是采用结构体和共联体结合的方式来提供给软件人员进行开发,同时在平时的编码过程中这两个数据类型的灵活应用也能够实现代码更好的封装与简化。 如下面的简单示例,就可以非常灵活的访问Val中的bit位。 typedef union
{
BYTE Val;
struct __packed
{
BYTE b0:1;
BYTE b1:1;
BYTE b2:1;
BYTE b3:1;
BYTE b4:1;
BYTE b5:1;
BYTE b6:1;
BYTE b7:1;
} bits;
}BYTE_VAL, BYTE_BITS;
其中:1表示按位操作。不只是位-字节可以,单字节与多字节也可以简化拼接。 #include "stdio.h"
typedef struct
{
union
{
struct
{
unsigned char low;
unsigned char high;
};
unsigned short result;
};
}test_t;
int main(int argc, char *argv[])
{
test_t hello;
hello.high=0x12;
hello.low=0x34;
printf("result=%04X\r\n",hello.result);//输出 result=1234
return 0;
}
运行输出 result=1234 (win7系统下QT开发环境),原本需要 (high<<8)|low 运算,可以简化为共用体类型自动完成,但必须注意平台的字节顺序,属于大端还是小端模式。 在应用层面,如果明确某个数据可能存在两种可能,而且两种结果不会同时存在,也可以使用结构体与共用体组合的方式,确保模块对外接口统一。 例如移动通信模块,使用数据结构保存其基站信息,因为制式不同,模块可能工作在2G-GSM,也可能在4G-Cat1,为保证上层读取基站信息接口唯一,使用共用体就非常合适,否则需定义两套接口。
|