КОМПЬЮТЕРНАЯ ЛИТЕРАТУРА

Turbo C++ Version 1.0 Programmer’s Guide

Комментировать

LIB.com.ua [электронная библиотека]: : TURBO C++ Version 1.0 Programmer’s Guide

Если опция выравнивания включена, топриведенный пример
структуры имел бы добавленный перед double байт, и весь объ-
ект в целом занимал бы 32 байта.

Пространство имен структур

Имена тегов структур разделяют общее пространство имен
стегами объединений и перечислимых данных (однако в С++ име-
на входящих в структуру перечислимых данных находятсяв дру-
гом адресном пространстве). Это означает, что в пределах од-
ного контекста такие теги должны иметь уникальные имена.
Однако, имена тегов не обязаны отличаться от идентификато-
ров, находящихся в трех других адресных пространствах:
пространстве имен меток, пространстве (пространствах) имен
компонентов и едином адресном пространстве (которое состоит
из имен переменных, функций, имен typedef и нкмераторов).

Имена компонентов в пределах данной структуры или объ-
единения лбязаны быть уникальными, но среди разных структур
или объединений они могут совпадать. Например,

goto s;

struct s (* // так можно; теги и имена меток находятся
в разных // адресных пространствах
int s; // так можно; теги, имена меток и имена компо-
нентов // дятся в разных адресных пространствах
float s;// так нельзя: повторение имени компонентов
структур *) s; // так можно; пространства имен переменных
различны // В С++ это допустимо только если s не имеет
// конструктора.

union s (* // так нельзя: повторение имен в пространс-
тве тегов int s; // так можно: новое пространство компонен-
тов float f;
*) f; // так можно: пространство имен переменных

struct t (*
int s; // так можно: следующее пространство имен компо-
ненто

*) s; // так нельзя: повторение имен переменных

Неполные объявления

Указатель структуры типа А допустим в объявлении другой
структуры В до объявления структуры А:

struct A;// неполное объявление struct B (* struct A
*pa *);
struct A (* struct B *pb *);

Первое объявление А называется неполным, поскольку в
этой точке отсутствует определение А. В данной ситуации не-
полное объявление допустимо, поскольку в объявлении В размер
А необязателен. Битовые поля

— 67 —
Структура можетсодержать любые комбинации битовых полей
с данными других типов.

Целочисленные компоненты типа signed или unsigned можно
объявить битовыми полями шириной от 1 до 16 бит. Ширина би-
тового поля и его опциональный идентификатор задаются следу-
ющим образом:

спецификатор-типа :ширина;

где спецификатор-типа это char, unsigned char, int или
unsigned int. Битовые поля располагаются с нижнего и кончая
саршим битом слова. Выражение «ширина» должно быть задано и
должно давать целочисленную константу со значением в диапа-
зоне от 0 до 16.

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

struct mystruct (*
int i:2;
unsigned j:5;
int :4;
int k:1;
unsigned m:4;
*) a, b, c;

создает следующее распределение памяти.

————————————————————
\! 15\! 14\! 13\! 12\! 11\! 10\! 9 \! 8 \! 7 \! 6 \! 5
\! 4 \! 3 \! 2 \! 1 \! 0 \!
————————————————————
\! x \! x \! x \! x \! x \! x \! x \! x \! x \! x \! x

\! x \! x \! x \! x \! x \!
————————————————————
\!\!\!\!\!\!
————————————————————
\! m \! k \!не используется\! j \! i \!
————————————————————

Целочисленные поля хранятся в виде дополнения до двух,
причем крайний левый бит побещается в MSB (наиболее значащий
бит).Для битового поля типа Int (например, signed) MSB ин-
терпретируется как знаковый бит. Битовое поле шириной 2, со-
держащее двоичное 11, будет, следовательно, в случае типа
unsigned интерпретироватьсякак 3, а в случае Int как -1. В
предыдущем примере допустимое выражение a.i = 6 поместит в
a.i двоичное 10 = -2, не выдавая каких-либо предупреждений.
Поле k типа signed int шириной 1 может содержать только зна-
чения -1 и 0, так как битовый шаблон 1 будет интерпретирован
как -1.

Примечание

Битовые поля могут быть объявлены только в структурах,
объединениях и классах. Доступ к ним выполняется теми жесе-
лекторами компонентов (. и ->), что используются для доступа
к компонентам других типов. Кроме того, битовые поля вызыва-
ют некоторые проблемы с созданием переносимых кодов, пос-
кольку организация битов в байтах и байтов в словах зависит
от конкретной машины.

— 68 —

Выражение &mystruct.x недопустимо, так как x это иден-
тификатор битового поля, а никакой гарантии, что mystruct.x
имеет адрес на границе байта, нет.

Объединения

Объединения соответствуют типам вариантных записей язы-
ков Pascal и Modula-2.

Типы объединений являются производными типами, разделя-
ющими многие синтаксические и функциональные свойства типов
структур. Главное отличие между ними состоит в том, что объ-
единение позволяет быть «активным» одновременно только одно-
му компоненту. Размер объединения равен таким образом разме-
ру своего максимального компонента. Одновременно в памяти
может находиться значение только одного компонента лобъеди-
нения. В следующем простом случае

union myunion (* /* тег объединения = myunion */
int i;
double d;
char ch;
*) mu, *muptr=μ

идентификатор mu типа union myunion может служить для
хранения 2-байтового значения int, 8-байтового значения
double или 1-байтового char, но одновременно — только одного
из этих значений.

Обе операции sizeof(union myunion) и sizeof (mu) возв-
ращают значение 8, но когда mu содержит объект типа int, то
6 байт остаются неиспользованными (туда помещаются симво-
лы-заполнители), а когда mu сщдержит объект типа char — то 7
байт. Доступ к компонентам объединения выполняетсяпри помощи
селекторов компонента структуры (. и ->), но требуется соб-
людать осторожность:

mu.d = 4.016;
printf(«mu.d = %f\n»,mu.d);// порядок: на дисплее mu.d
= 4.016
printf(«mu.i = %f\n»,mu.i);// забавный результат !
mu.ср = ‘A’;
printf(«mu.ch = %c\n»,mu.ch); // порядок: на дисплее
mu.ch = A
printf(«mu.d = %f\n»,mu.d); // забавный результат !
muptr->i = 3; printf(«mu.i = %d\n»,mu.i); // порядок: на
дисплее mu.i = 3

Второй оператор printf допустим, поскольку mu.i цело-
численного типа. Однако, битовая комбинация в mu.i соответс-
твует части ранее присвоенного значения типа double и не
даст как правило полезной целочисленной интерпретации.

При правильных преобразованиях указатель объединения
может указывать на любые его компоненты, и наоборот.

Объявления объединений

Общий синтаксисобъявления объединений во многом напоми-
нает синтаксис объявления структур. Различия состоят в сле-
дующем:

1. Объединения могут содержать битовые поля, но актив-
ным бывает только одно изних. Все они начинаются в начале
объединения.

— 69 —
2. С++ : В отличие от структур С++, объединения С++ не
могут использовать спецификаторы класса доступа:public,
private и protected. Все поля объединения имеют доступ

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *