Определение типа
В языке "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) ();