C结构中的“:”(冒号) – 这是什么意思?

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是什么意思?

那些是位域。 基本上,冒号后面的数字描述该字段使用多less位。 这里是MSDN描述位字段的引用 :

常量expression式以位为单位指定字段的宽度。 声明符的types说明符必须是unsigned int,signed int或int,常量expression式必须是非负整数值。 如果值为零,则声明没有声明。 位字段的数组,位字段的指针和返回位字段的函数是不允许的。 可选的声明符命名位域。 位字段只能被声明为结构的一部分。 运算符地址(&)不能应用于位域组件。

未命名的位字段不能被引用,并且它们在运行时的内容是不可预知的。 它们可以用作“虚拟”字段,用于alignment目的。 宽度被指定为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链接的另一个重要的位:

位字段与整数types具有相同的语义。 这意味着在expression式中使用位字段的方式与使用相同基本types的variables完全相同,而不pipe位字段中有多less位。

快速示例很好地说明了这一点。 有趣的是,对于混合types,编译器似乎默认为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和8的位域。

我也遇到了冒号记号,但在我的情况下,位字段没有意义。 所以我做了一些挖掘。 这个符号也用于赋值 – 在我的具体情况指针函数。

资料来源: 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 };