Урок №63. Псевдоніми типів: typedef і type alias

  Юрій  | 

  Оновл. 16 Тра 2020  | 

 88

У цьому уроці ми розглянемо псевдоніми типів typedef і type alias в C++.

typedef

Ключове слово 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 і кросплатформність

Ще однією великою перевагою 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 і спрощення складного

Хоча ми до сих пір розглядали тільки прості типи даних, в C++ ви можете побачити і наступні змінні/функції:

Писати std::vector<std::pair<std::string, int> > всякий раз, коли потрібно використовувати цей тип — не дуже ефективно і затратно як за часом, так і по докладеним зусиллям. Набагато простіше використовувати typedef:

Ось! Інша справа! Адже простіше використовувати pairlist_t замість std::vector<std::pair<std::string, int> >, чи не так?

Не переживайте, якщо ви ще не знаєте, що таке std::vector, std::pair та інше. Набагато важливіше зараз засвоїти, що за допомогою typedef ви можете давати прості імена складним типам даних, що зробить їх простішими як для використання, так і для розуміння.

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

Використовуючи прототип функції з завдання №1, конвертуйте тип значення int, що повертається, в status_t, використовуючи ключове слово using (C++11). У відповіді до цього завдання вкажіть стейтмент створення псевдоніма типу і оновлений прототип функції.

Відповідь №2

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (2 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *