Вопрос о конструкции C - PullRequest
4 голосов
/ 17 июня 2009

Мне всегда казалось, что я очень хорошо знаю C, пока не увидел нечто подобное в другом посте:

struct foo {
    int x:1;
};

Мне бы очень хотелось узнать цель: 1. Кто-нибудь может подсказать мне? Спасибо.

Ответы [ 4 ]

11 голосов
/ 17 июня 2009

битовый. x имеет длину 1 бит.

К каждому полю обращаются и манипулируют как будто это был обычный член состав. Ключевые слова подписаны и без знака означает, что вы ожидаете, кроме того, что интересно отметить что 1-битное подписанное поле на двоих дополнить машину можно только на значения 0 или -1. Декларации разрешено включать const и изменчивые квалификаторы.

Основное использование битовых полей - это либо разрешить плотную упаковку данных или быть возможность указать поля в некоторых внешне созданные файлы данных. С не дает гарантии заказа поля внутри машинных слов, так что если вы используйте их по последней причине, вы программа будет не только непереносимой, это также будет зависеть от компилятора. Стандарт говорит, что поля упакованы в «единицы хранения», которые как правило, машинные слова. Упаковка порядок и битовое поле или нет могут пересекать границы единицы хранения, являются реализация определена. Заставить выравнивание по границе единицы хранения, поле нулевой ширины используется перед тот, который вы хотите выровнять.

Будьте осторожны, используя их. Это может потребовать удивительное количество кода во время выполнения манипулировать этими вещами, и вы можете в конечном итоге, используя больше места, чем они сохранить.

Битовые поля не имеют адресов - вы не может иметь указатели на них или массивы из них.

http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html

3 голосов
/ 17 июня 2009

это битовые поля. в структурах вы можете определить, сколько битов назначено переменной (переопределяя стандарт для типа переменной)

в приведенном выше примере x использует только 1 байт и, таким образом, может принимать только значение 0 или 1.

см. Следующий пример из книги C . перейдите по ссылке для получения дополнительной информации.

struct {
      /* field 4 bits wide */
      unsigned field1 :4;
      /*
       * unnamed 3 bit field
       * unnamed fields allow for padding
       */
      unsigned        :3;
      /*
       * one-bit field
       * can only be 0 or -1 in two's complement!
       */
      signed field2   :1;
      /* align next field on a storage unit */
      unsigned        :0;
      unsigned field3 :6;
}full_of_fields;
1 голос
/ 17 июня 2009

Это битовое поле длиной 1 бит. В Википедии .

есть хорошая дискуссия.
0 голосов
/ 17 июня 2009

Этот синтаксис используется для обозначения битовых полей (то есть полей битов, которые являются более узкими, чем сам тип данных), поэтому «x» в вашем примере действительно использует 1 бит целого.

Более полезным примером может быть что-то вроде

char x:4;
char y:4;

Это упаковало бы два 4-битных поля в один байт. Преимущество, конечно, состоит в том, чтобы сэкономить место в архитектурах, где каждый байт имеет решающее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...