Опубликован: 05.07.2006 | Доступ: свободный | Студентов: 4679 / 885 | Оценка: 4.12 / 3.74 | Длительность: 18:59:00
Лекция 7:

Структуры

6.9. Определение типа

В языке "C" предусмотрена возможность, называемая typedef для введения новых имен для типов данных. Например, описание

typedef int length;

делает имя length синонимом для int. "Тип" length может быть использован в описаниях, переводов типов и т.д. Точно таким же образом, как и тип int:

length len, maxlen; 
length *lengths[];

Аналогично описание

typedef char *string;

делает string синонимом для char*, то есть для указателя на символы, что затем можно использовать в описаниях вида

string p, lineptr[lines], alloc();

Обратите внимание, что объявляемый в конструкции typedef тип появляется в позиции имени переменной, а не сразу за словом typedef. Синтаксически конструкция typedef подобна описаниям класса памяти extern, static и т. д. Мы также использовали прописные буквы, чтобы яснее выделить имена.

В качестве более сложного примера мы используем конструкцию typedef для описания узлов дерева, рассмотренных ранее в этой лекции:

typedef struct tnode { /* the basic node */ 
char *word; /* points to the text */ 
int count; /* number of occurrences */ 
struct tnode *left; /* left child */ 
struct tnode *right; /* right child */ 
} treenode, *treeptr;

В результате получаем два новых ключевых слова: treenode ( структура ) и treeptr ( указатель на структуру ). Тогда функцию talloc можно записать в виде

treeptr talloc()
 {
    char *alloc();
    return((treeptr) alloc(sizeof(treenode)));
 }

Необходимо подчеркнуть, что описание typedef не приводит к созданию нового в каком-либо смысле типа ; оно только добавляет новое имя для некоторого существующего типа. При этом не возникает и никакой новой семантики: описанные таким способом переменные обладают точно теми же свойствами, что и переменные, описанные явным образом. По существу конструкция typedef сходна с #define за исключением того, что она интерпретируется компилятором и потому может осуществлять подстановки текста, которые выходят за пределы возможностей макропроцессора языка "C". Например,

typedef int (*pfi) ();

создает тип pfi для " указателя функции, возвращающей значение типа int ", который затем можно было бы использовать в программе сортировки из "лекции №5" в контексте вида

pfi strcmp, numcmp, swap;

Имеются две основные причины применения описаний typedef. Первая причина связана с параметризацией программы, чтобы облегчить решение проблемы переносимости. Если для типов данных, которые могут быть машинно-зависимыми, использовать описание typedef, то при переносе программы на другую машину придется изменить только эти описания. Одна из типичных ситуаций состоит в использовании определяемых с помощью typedef имен для различных целых величин и в последующем подходящем выборе типов short, int и long для каждой имеющейся машины. Второе назначение typedef состоит в обеспечении лучшей документации для программы - тип с именем treeptr может оказаться более удобным для восприятия, чем тип, который описан только как указатель сложной структуры. И наконец, всегда существует вероятность, что в будущем компилятор или некоторая другая программа, такая как lint, сможет использовать содержащуюся в описаниях typedef информацию для проведения некоторой дополнительной проверки программы.