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