void

void — спеціальний тип результату функцій, який позначає що функція нічого не повертає. Застосовується в мовах програмування, похідних від C або Algol68.

Зазвичай такі функції застосовуються заради їхніх побічних ефектів, таких як виконання якогось завдання або запис у вихідні параметри. Використання типу void у такому контексті можна порівняти з процедурами у мові Pascal або підпрограмами у Fortran, BASIC. Тип void подібний до одиничного типу, що використовується у функційних мовах програмування та в теорії типів.

Мови C та C++ також підтримують вказівник на тип void (визначається як void *), але це не пов'язане поняття. Змінні цього типу є вказівниками на дані невизначеного типу, тому в цьому контексті (але не в інших) void * діє приблизно як універсальний або верхній тип. Програма, ймовірно, може перетворити вказівник на будь-який тип даних (крім вказівника функції) у вказівник на void і назад до початкового типу, не втративши інформації, що робить ці вказівники корисними для поліморфних функцій. Стандарт мови C не гарантує, що різні типи вказівників мають однаковий розмір або вирівнювання.

Застосування в С та С++

Функція з типом результату void закінчується або досягненням кінця функції, або виконанням оператора return без поверненого значення. Тип void можна також використати як єдиний аргумент прототипу функції, що вказує на те, що функція не приймає аргументів.

Важливо, що, попри назву, у всіх цих ситуаціях тип void є одиничним типом, а не нульовим або нижнім типом (який іноді помилково називають «тип void»), хоча, на відміну від реального одиничного типу, який є атомарним, тип void не має способу представити значення, а мова не надає жодного способу оголосити об'єкт або представити значення з типом void.

В ранніх версіях C функції без конкретного результату за замовчуванням повертали тип void, а функції без аргументів просто мали порожні списки аргументів. Вказівники на не типізовані дані оголошувались як цілі числа або вказівники на символи. Деякі ранні компілятори C мали функцію, яка генерувала попередження про будь-який виклик функції, який не використовував повернуте значення функції. Старий код іноді передає такі виклики функції як void для придушення цього попередження. У 1979—1980 рр., коли Б'ярн Страуструп розпочав свою роботу над C++, void та вказівники void були частиною діалекту мови С, підтримуваного AT&T сумісними компіляторами.[1]

Явне використання void замість надання аргументів у прототипі функції має різну семантику в C та C++. Порівняння наведено в таблиці:[2]

C C++ еквівалент
void f(void); void f(); краще
void f(void);
void f();
приймає постійну, але невідому кількість аргументів
template <typename... Ts> void f(Ts... ts) {}
не повністю рівнозначно

Прототипи в С без аргументів, наприклад void f() не рекомендуються до використання, починаючи з C99.[3]

Застосування в Haskell

На відміну від C++, у функціональній мові програмування Haskell тип void позначає порожній тип, який не існує й не може мати значень.[4] Функція типу void не повертає результатів, а програма з побічним ефектом із типом IO Void не завершує роботу або не зазнає аварійного завершення. Зокрема, немає загальних (total) функцій типу void.

Примітки

  1. http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, «Standardisation.»
  2. Stroustrup, Bjarne (2009). Programming: Principles and Practice Using C++. Boston: Addison-Wesley. с. 996. ISBN 0-321-54372-6.
  3. Bjarne Stroustrup, C and C++: Case Studies in Compatibility. Reconcilable differences? You decide, Dr. Dobb's, 1 вересня 2002; print version
  4. A Haskell 98 logically uninhabited data type
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.