Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
http.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.34 Mб
Скачать

Использование sizeof для обеспечения переносимости

Как было показано, структуры и объединения могут использоваться для создания переменных различных типов и настоящий размер этих переменных может меняться при переносе программы с одной платформы на другую. Унарный оператор sizeof используется для вычисления размера любой переменной или типа, и он может использоваться для устранения машинной зависимости кода программы. Особенно он эффективен при использовании со структурами и объединениями.

Необходимо помнить, что Borland С++ имеет следующие размеры для следующих типов данных:

Тип

Размер в байтах

char int (16 бит) int (32 бита) long int float double long double

1 2 4 4 4 8 10

Следовательно, если в системе используются 16-битные целые, то следующий код выдаст на экран 1, 2, 4 и 10: char ch; int i; float f; printf("%d", sizeof ch); printf("%d", sizeof i); printf("%d", sizeof f); printf("%d", sizeof (long double));

Размер структуры равен или больше суммы размеров ее членов. Например: struct s { char ch; int i; float f; } s_var; Здесь sizeof(s_var) имеет размер, по крайней мере 7 (4+2+1). На самом деле размер s_var может быть больше. В зависимости от используемого компилятора (и от установки опций), возможно выравнивание данных на границу слов (или параграфов). Это означает, что размер составного типа данных (типа структур) может быть немного больше, чем сумма частей. Таким образом, складывание вручную длин членов структуры может не дать правильного размера. Поэтому для максимальной переносимости следует использовать sizeof для определения размера структурной переменной.

Поскольку оператор sizeof - это оператор времени компиляции, вся необходимая информация для вычисления размера переменных известна на этапе компиляции. Это особенно важно для объединений, поскольку размер объединений всегда равен размеру самого большого члена. Рассмотрим следующий пример: union u { char ch; int i; float f; } u_var; sizeof(u var) будет равен 4. Во время выполнения не имеет значения, что содержит u_var. Имеет значение только размер наибольшей переменной, которую оно может содержать, поскольку размер объединения совпадает с размером наибольшего элемента.

TYPEDEF

Язык С позволяет определять имена новых типов данных с помощью ключевого слова typedef. На самом деле здесь не создается новый тип данных, а определяется новое имя существующему типу. Он позволяет облегчить создание машинно-независимых программ. Единственное, что потребуется при переходе на другую платформу, - это изменить оператор typedef. Он также может помочь документировать код, позволяя назначать содержательные имена стандартным типам данных. Стандартный вид оператора typedef следующий: typedef тип имя; где тип — это любой существующий тип данных, а имя - это новое имя для данного типа. Новое имя определяется в дополнение к существующему имени типа, а не замещает его. Например, можно создать новое имя для float, используя typedef float balance; Данный оператор сообщает компилятору о необходимости распознавания balance как другого имени для float. Далее можно создать вещественную переменную, используя balance: balance past_due; Здесь past_due - это вещественная переменная типа balance, другими словами - типа float. Можно использовать typedef для создания имен для более сложных типов. Например: typedef struct { float due; int over_due; char name[40]; } client; /* здесь client - это имя нового типа */ client clist[NUM_CLIENTS]; /* определение массива структур типа client */

Использование typedef может помочь при создании более легкого для чтения и более переносимого кода. Но надо помнить, что на самом деле не создаются никакие новые типы данных.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]