":" (colon) in C struct - what does it mean?

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;

What does :1 and :8 mean?

74733 次浏览

它定义宽度为1和8的位字段。

那些都是小地方。基本上,冒号后面的数字描述了该字段使用了多少位。下面是描述位字段的 引自 MSDN:

常量表达式以位为单位指定字段的宽度 声明程序的类型说明符必须是无符号整型、有符号整型或 而常量表达式必须是非负整数值。 如果值为零,则声明没有声明器 字段、指向位字段的指针和返回位字段的函数是 不允许。可选声明符命名位字段。位字段 只能作为结构的一部分声明 (&)不能应用于位字段组件。

无法引用未命名位字段,其内容正在运行 时间是不可预测的。它们可以用作“虚拟”字段,用于 宽度指定为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 链接的另一个重要部分:

位字段具有与整数类型相同的语义。这意味着 在表达式中使用 bit 字段的方式与使用变量的方式完全相同 不管有多少位,都将使用相同基类型的 在钻头领域。

有趣的是,对于混合类型,编译器似乎默认为 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));

测试1:4

测试2:2

测试3:1

测试4:4

我还遇到了冒号表示法,但在我的上下文中,位字段没有意义。所以我做了些调查。这种表示法也用于赋值-在我的特定情况下指向函数。

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