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 };