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

Moh*_*ged 85 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;
Run Code Online (Sandbox Code Playgroud)

是什么:1:8意味着什么?

Joe*_*ish 64

那些是位字段.基本上,冒号后面的数字描述了字段使用的位数.以下是MSDN引用位域的引用:

constant-expression以位为单位指定字段的宽度.声明符的类型说明符必须是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];
Run Code Online (Sandbox Code Playgroud)

编辑:来自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));
Run Code Online (Sandbox Code Playgroud)

test1:4

test2:2

test3:1

test4:4

  • @smwikipedia 在这里提供了一个简单易懂的原则:如果 `int` 类型的两个字段都可以放入单个 int (即上面示例中的 32 位),则编译器仅分配单个 int 的内存价值(test_1,短类型test_2,test3 的字符类型)。在上面的示例中被忽略,如果单个 int 无法再容纳位域,我们将添加第二个。请参阅此[示例](/sf/answers/3480586931/)以获取更详细的解释。 (2认同)

小智 15

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

资料来源: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
};
Run Code Online (Sandbox Code Playgroud)

C99(旧的,兼容的)方式如下:

struct file_operations fops = {
   .read = device_read,
   .write = device_write,
   .open = device_open,
   .release = device_release
};
Run Code Online (Sandbox Code Playgroud)

  • AnT,有人搜索"C struct initialization colon"可能会找到这个答案,而这正是我所寻找的.谢谢,user27346! (11认同)
  • 首先,这不是赋值,它是*初始化*.其次,您描述的功能(*指定的初始化程序*)与问题的内容完全无关(*位字段*).仅仅因为过时的GCC扩展在语法中使用`:`并不意味着它与问题中的`:`有任何关系. (7认同)
  • 稍后读者需要注意:冒号`:`出现在c结构声明(问题所属)和定义时初始化(答案所属)不是一回事。 (2认同)

zvr*_*rba 6

它定义了宽度为1和8的位域.

  • 虽然准确,答案应该解释一下比特域_is_. (22认同)