typedef - КРАТКИЙ ОБЗОР
typedef - КРАТКИЙ ОБЗОР
Функция typedef позволяет нам создать свое собственное имя типа. Это напоминает директиву #define, но со следующими тремя изменениями:
1. В отличие от #define функция typedef дает символические имена, но ограничивается только типами данных.
2. Функция typedef выполняется компилятором, а не препроцессором.
3. В своих пределах функция typedef более гибка, чем #define.
Посмотрим, как она работает. Предположим, вы хотите использовать термин real для чисел типа float. Тогда вы определяете термин real, как если бы он был переменной типа float, и перед его определением ставите ключевое слово typedef:
typedef float real;
С этого момента вы можете использовать real для определения переменных:
real х, у[25], *рr;
Область действия такого определения зависит от расположения оператора typedef. Если определение находится внутри функции, то область действия локальна и ограничена этой функцией. Если определение расположено вне функции, то область действия глобальна.
Часто в этих определениях используются прописные буквы, чтобы напомнить пользователю, что имя типа является на самом деле символической аббревиатурой:
typedef float REAL;
В последнем примере можно было бы применить директиву #define. А здесь это делать нельзя:
typedef char *STRING;
Без ключевого слова typedef оператор определял бы STRING как указатель на тип char. С ключевым словом оператор делает STRING идентификатором указателей на тип char. Так,
STRING name, sign;
означает
char *name, *sign;
Мы можем использовать typedef и для структур. Вот пример:
typedef struct COMPLEX {
float real;
float imag; };
Кроме того, можно использовать тип COMPLEX для представления комплексных чисел.
Одна из причин использования typedef заключается в создании удобных, распознаваемых имен для часто встречающихся типов. Например, многие пользователи предпочитают применять STRING или его эквивалент, как это мы делали выше. Вторая причина: имена typedef часто используются для сложных типов. Например, описание
typedef char *FRPTC ( ) [5];
приводит к тому, что FRPTC объявляет тип, являющийся функцией, которая возвращает указатель на пятиэлементный массив типа char. (См. "Причудливые описания".)
Третья причина использования typedef заключается в том, чтобы сделать программы более мобильными. Предположим, например, что вашей программе нужно использовать 16-разрядные числа. В некоторых системах это был бы тип short, в других же он может быть типом int. Если вы использовали в ваших описаниях short или int, то должны изменить все описания, когда перейдете от одной системы к другой. Вместо этого сделайте следующее, В файле директивы #include есть такое определение:
typedef short TWOBYTE;
Используйте TWOBYTE в ваших программах для переменных типа short, которые должны быть 16-разрядными. Тогда если вы перемешаете программу туда, где необходимо использовать тип int, то следует только изменить одно определение в вашем файле директивы #include:
typedef int TWOBYTE;
Это пример того, что делает язык Си столь мобильным. При использовании typedеf следует иметь в виду, что он не создаст новых типов, он только создает удобные метки.