Урок 60. Псевдонимы типов. Typedef и type alias

   ⁄ 

 Обновлено 10 мая 2017

  ⁄   

Typedef позволяет программисту создать псевдоним для любого типа данных и использовать его вместо фактического имени типа. Чтобы объявить typedef (псевдоним типа) — используйте ключевое слово typedef, дальше тип данных, для которого создается псевдоним, а дальше сам псевдоним:

Обычно, к псевдонимам typedef добавляют окончание «_t». Указывая, таким образом, что это типы, а не переменные, а также в целях предотвращения возникновения конфликтов имен с аналогичными именами переменных (если таковые будут).

Typedef не определяет новый тип. Это просто псевдоним (другое имя) для уже существующего типа. Его можно использовать везде, где используется обычный тип.

Даже если следующее не имеет смысла — это все равно разрешено в C++:

Псевдонимы типов чрезвычайно полезны в целом ряде ситуаций.

Использование typedef для улучшения читабельности кода

Первое использование typedef — улучшение документации и разборчивости кода. Имена типов, такие как char, int, long, double и bool хороши для описания того, какой тип возвращает функция, но чаще всего мы хотим знать, для какой цели служит возвращаемое значение.

Например, рассмотрим следующую функцию:

Мы видим, что возвращаемое значение — целое число, но что оно означает? Количество пропущенных вопросов? Идентификационный номер учащегося? Код ошибки? Как знать? Сам int особо не о чем не говорит.

Однако, с использованием возвращаемого типа testScore_t, становится очевидным, что функция возвращает тип, значение которого является результатом теста.

Использование typedef в поддержке кода

Typedef также позволяет изменить базовый тип объекта без внесения изменений в большое количество кода. Например, если вы использовали тип short для хранения идентификационного номера учащегося, но потом решили, что лучше использовать тип long, то вам придется прочесать кучу кода для замены short-а на long. И вероятно, было бы трудно определить, какие из типов short используются для хранения идентификационных номеров, а какие для других целей.

Однако с typedef всё, что вам нужно сделать, это изменить объявление — typedef short studentID_t на typedef long studentID_t. Тем не менее, не стоит забывать об осторожности при изменении типа typedef на тип из другого семейства (например, с int на float или наоборот)! Новый тип может иметь проблемы со сравнением или делением целых чисел/чисел типа с плавающей запятой, которые старый тип не имел – это следует помнить.

Кроссплатформенность

Еще одним большим преимуществом typedef является возможность скрывать специфические, для определенных платформ (операционных систем), детали. На некоторых платформах тип int занимает 2 байта, на некоторых — 4. Таким образом, использование int для хранения более 2 байтов информации может быть потенциально опасным при написании кроссплатформенного кода.

Поскольку char, short, int и long не указывают свой размер, для кроссплатформенных программ довольно часто используется typedef для определения псевдонимов, которые включают размер типа данных в битах. Например, int8_t — это 8-битный signed int, int16_t — 16-битный signed int, а int32_t — 32-битный signed int. Таким образом, использование псевдонимов typedef помогает предотвратить ошибки и более четко определить, какие предположения были сделаны относительно размера переменной.

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

Использование typedef для упрощения сложного

Хоть мы до сих пор рассматривали только простые типы данных, в C++ вы можете увидеть и такие переменные или функции:

Вводить std::vector<std::pair<std::string, int> > всякий раз, когда нужно использовать этот тип, не очень эффективно и по затратам времени, и по затратам усилий. Гораздо проще использовать typedef:

Другое дело! Ведь проще использовать pairlist_t вместо std::vector<std::pair<std::string, int> >, не так ли?

Не переживайте, если вы еще не знаете, что такое std::vector, std::pair и прочее. Гораздо важнее сейчас усвоить, что с помощью typedef вы можете давать простые имена сложным типам данных, что сделает их проще как для использования, так и для понимания.

Типы псевдонимов в C++ 11. Type alias

У typedef есть также свои моментики. Во-первых, легко забыть, что пишется первым: псевдоним типа или имя типа. Что правильно?

Я никак не могу запомнить.

Во-вторых, синтаксис typedef становится уже менее привлекательным в связке со сложными типами данных (об этом мы поговорим, когда будем рассматривать указатели на функции).

Для решения этих моментиков, в C++ 11 ввели новый улучшенный синтаксис для typedef, который имитирует способ объявления переменных. Этот синтаксис называется type alias (тип псевдонима). С помощью type alias мы пишем имя, которое используется как синоним типа (т.е. принцип тот же, но синтаксис более удобен).

Следующий typedef:

В С++ 11 можно объявить как:

Эти два способа функционально эквивалентны.

Обратите внимание, что хоть мы используем ключевое слово «using», оно не имеет ничего общего со стейтментами using, связанными с пространствами имен. Это ключевое слово имеет несколько значений, в зависимости от контекста.

Новый синтаксис создания псевдонимов является более чистым при использовании в сложных ситуациях, и мы рекомендуем использовать его вместо обычного typedef, если ваш компилятор поддерживает C++ 11.

Правило: Используйте type alias вместо typedef, если ваш компилятор совместим с C++ 11.

Тест

Есть прототип функции:

1. Преобразуйте тип возвращаемого значения int в status_t, используя ключевое слово typedef. В ответе укажите стейтмент typedef и обновленный прототип функции.

Ответ 1

2. Преобразуйте тип возвращаемого значения int в status_t, используя ключевое слово using (C++ 11). В ответе укажите стейтмент создания псевдонима и обновленный прототип функции.

Ответ 2

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (7 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *