在帖子http://bbs.21ic.com/club/bbs/bbsView.asp?action=topicwithme上,提出以下代码不能用:
struct {
unsigned unused:2;
unsigned Key5: 1;
unsigned Key6: 1;
unsigned Key4: 1;
unsigned Key3: 1;
unsigned Key1: 1;
unsigned Key2: 1;
}HardKey;
我粗看一下,觉得有一下两个毛病:
第一:结构体的声明是不是有问题,应该用一个类型名,然后在定义一个该类型名的变量;
第二: unsigned是指那个,unsigned int/unsigned char/unsigned long都有可能。
随后的跟贴中也有提到第一个毛病的,后来我在正在看的Programming Embedded Systems with C and GNU Development Tools Michael Barr书中找出关于结构体的应用,在7.1.1.7中有:
struct { uint8_t bit0 : 1; uint8_t bit1 : 1; uint8_t bit2 : 1; uint8_t bit3 : 1; uint8_t nibble : 4; } foo;
关于结构体的定义的毛病的解释是错误的。平时看书都是一晃而过,这些基础的东西都没有留意。
深入一些,就是用联合union来处理这个bitfield了:
union { uint8_t byte; struct { uint8_t bit0 : 1; uint8_t bit1 : 1; uint8_t bit2 : 1; uint8_t bit3 : 1; uint8_t nibble : 4; } bits; } foo;
仍然不需要定义类型名声明变量的……