Void: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
перша версія
 
доповнення
Рядок 4:
 
[[C]] та [[C++]] також підтримують [[вказівник]] на тип ''void'' (визначається як <code>void *</code>), але це не пов'язане поняття. [[Змінна (програмування)|Змінні]] цього типу є вказівниками на дані невизначеного типу, тому в цьому контексті (але не в інших) <code>void *</code> діє приблизно як універсальний або [[верхній тип]]. Програма, ймовірно, може перетворити покажчик на будь-який тип даних (крім покажчика функції) у покажчик на ''void'' і назад до вихідного типу, не втрачаючи інформацію, що робить ці вказівники корисними для поліморфних функцій. Стандарт мови C не гарантує, що різні типи покажчиків мають однаковий розмір або вирівнювання.
 
== Застосування в С та С++ ==
Функція з типом результату ''void'' закінчується або досягненням кінця функції, або виконанням [[Інструкція повернення|оператора return]] без поверненого значення. Тип void може також позначений як єдиний аргумент прототипу функції, що вказує на те, що функція не приймає аргументів.
 
Важливо, що, незважаючи на назву, у всіх цих ситуаціях тип void є типом одиниці, а не нульовим або нижнім типом (який іноді помилково називають "тип void"), хоча, на відміну від реального типу одиниці, який є атомарним, тип void не має способу представити значення, а мова не надає жодного способу оголосити об'єкт або представити значення з типом void.
 
В ранніх версіях C функції без конкретного результату за замовчуванням повертали тип int, а функції без аргументів просто мали порожні списки аргументів. Покажчики на не типізовані дані оголошувались як цілі числа або покажчики на символи. Деякі ранні компілятори C мали функцію, яка генерувала попередження про будь-який виклик функції, який не використовував повернене значення функції. Старий код іноді передає такі виклики функції порожнім для придушення цього попередження. На той час, коли [[Б'ярн Страуструп]] розпочав свою роботу над C++ у 1979–1980 рр., void та void вказівники були частиною діалекту мови С, які підтримували AT&T сумісними компіляторами.<ref>http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, "Standardisation."</ref>
 
Явне використання void проти надання аргументів у прототипі функції має різну семантику в C та C++. Порівняння наведено в наступній таблиці:<ref>{{cite book | last = Stroustrup | first = Bjarne | title = Programming: Principles and Practice Using C++| publisher = Addison-Wesley | location = Boston | year = 2009 | isbn = 0-321-54372-6 | page=996}}</ref>
 
{| class="wikitable" border="1"
|-
! C
! C++ еквівалент
|-
| <code>void f(void);</code>
| <code>void f();</code> ''краще''<br> <code>void f(void);</code>
|-
| <code>void f();</code><br>''приймає постійну, але невідому кількість аргументів''
| <code>template <typename... Ts> void f(Ts... ts) {}</code><br>''не повністю рівнозначно''
|}
 
Прототипи в С без аргументів, наприклад <code>void f()</code> не використовуються з [[C99]]. <ref>Bjarne Stroustrup, ''[http://www.ddj.com/cpp/184401562 C and C++: Case Studies in Compatibility. Reconcilable differences? You decide]'', [[Dr. Dobb's]], September 01, 2002; [http://www.research.att.com/~bs/examples_short.pdf print version]</ref>
 
 
== Примітки ==
{{reflist}}
 
{{Типи даних}}