Подтвердить что ты не робот

":" (двоеточие) в C struct - что это значит?

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?

4b9b3361

Ответ 1

Это битовые поля. В основном, число после двоеточия описывает количество бит, которое использует поле. Ниже приведена цитата из MSDN, описывающая битовые поля:

Константное выражение указывает ширину поля в битах. Тип-спецификатор для декларатора должен быть без знака int, подписанным int или int, а константное выражение должно быть неотрицательным целочисленным значением. Если значение равно нулю, декларация не имеет декларатора. Массивы бит поля, указатели на битовые поля и функции, возвращающие поля бит, являются не допускается. Необязательный declarator называет поле бит. Поля бит может быть объявлена ​​только как часть структуры. Адрес-оператор (&) не может применяться к компонентам битового поля.

Неверные поля бита не могут быть указаны, а их содержимое при запуске время непредсказуемо. Они могут использоваться как поля "dummy", для выравнивание. Неименованное поле бит, ширина которого задается как 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

Ответ 2

Он определяет битовые поля шириной 1 и 8.

Ответ 3

Я также попал в нотацию двоеточия, но в моем контексте битовые поля не имели смысла. Поэтому я сделал рытье. Эта нотация также используется для назначения значений - в моей конкретной ситуации указатели на функции.

Источник: 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
};