struct _USBCHECK_FLAGS
{
unsigned char DEVICE_DEFAULT_STATE : 1;
unsigned char DEVICE_ADDRESS_STATE : 1;
unsigned char DEVICE_CONFIGURATION_STATE : 1;
unsigned char DEVICE_INTERFACE_STATE : 1;
unsigned char FOUR_RESERVED_BITS : 8;
unsigned char RESET_BITS : 8;
} State_bits;
:1
和:8
的含义是什么?
答案 0 :(得分:60)
那些是位字段。基本上,冒号后面的数字描述了字段使用的位数。这是一个描述位字段的quote from MSDN:
constant-expression以位为单位指定字段的宽度。该 声明符的type-specifier必须是unsigned int,signed int或 int,而constant-expression必须是非负整数值。 如果值为零,则声明没有声明符。阵列的位 字段,指向位字段的指针和返回位字段的函数 不允许。可选的声明符命名位字段。位字段 只能声明为结构的一部分。运营商的地址 (&)不能应用于位域组件。
无法引用未命名的位字段,并且在运行时无法引用它们的内容 时间是不可预测的。它们可以用作“虚拟”字段 对齐目的。未命名的位字段,其宽度指定为0 保证在其后面的成员存储 struct-declaration-list从int边界开始。
此示例定义了名为screen的二维结构数组。
struct
{
unsigned short icon : 8;
unsigned short color : 4;
unsigned short underline : 1;
unsigned short blink : 1;
} screen[25][80];
编辑:来自MSDN链接的另一个重要位:
位字段与整数类型具有相同的语义。这意味着一个 位字段在表达式中的使用方式与变量完全相同 无论有多少位,都将使用相同的基类型 在位域。
快速示例很好地说明了这一点。有趣的是,对于混合类型,编译器似乎默认为sizeof (int)
。
struct
{
int a : 4;
int b : 13;
int c : 1;
} test1;
struct
{
short a : 4;
short b : 3;
} test2;
struct
{
char a : 4;
char b : 3;
} test3;
struct
{
char a : 4;
short b : 3;
} test4;
printf("test1: %d\ntest2: %d\ntest3: %d\ntest4: %d\n", sizeof(test1), sizeof(test2), sizeof(test3), sizeof(test4));
test1:4
test2:2
test3:1
test4:4
答案 1 :(得分:14)
我也遇到了结肠符号,但在我的上下文中,位字段没有意义。所以我做了一些挖掘。这种表示法也用于赋值 - 在我的特定情况下指向函数的指针。
来源:http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm
以下是一个示例和摘要,以供解释。
“有一个gcc扩展程序,可以更方便地分配给这个结构。你会在现代驱动程序中看到它,并且可能会让你感到惊讶。这就是新的分配方式结构如下:“
struct file_operations fops = {
read: device_read,
write: device_write,
open: device_open,
release: device_release
};
C99(旧的,兼容的)方式如下:
struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
答案 2 :(得分:6)
它定义了宽度为1和8的位域。