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
.
Примітки
- http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, «Standardisation.»
- Stroustrup, Bjarne (2009). Programming: Principles and Practice Using C++. Boston: Addison-Wesley. с. 996. ISBN 0-321-54372-6.
- Bjarne Stroustrup, C and C++: Case Studies in Compatibility. Reconcilable differences? You decide, Dr. Dobb's, 1 вересня 2002; print version
- A Haskell 98 logically uninhabited data type