": "(двоеточие) в структуре 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 в смысле?

1657   4  
c

4 ответов:

это битовые поля. В основном, число после двоеточия описывает, сколько битов использует это поле. Вот это цитата из MSDN описания битовых полей:

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

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

Edit: еще один важный бит из ссылки 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

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

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

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

Comments

  1. Владимир
    Владимир 5 лет назад
    <p>Советую автору статьи читать то, что он пишет, а то из-за пропусков в тексте и  путаницы падежей и склонений получается плохопонимаемаемая невмятица.</p>