|
Структуры
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 информацию для проведения некоторой дополнительной проверки программы.