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

时间:2011-12-19 16:45:10

标签: c++ 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的含义是什么?

3 个答案:

答案 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的位域。