Void (datový typ)
Název void (anglicky prázdný) v informatice označuje dva odlišné datové typy. V programovacích jazycích odvozených od jazyka C a ALGOL68 se tak označuje typ pro výsledek funkce, která při návratu neposkytuje do volajícího výrazu žádnou výslednou (návratovou) hodnotu. Oproti tomu ve funkcionálních jazycích (např. v Haskellu) a teoretické počítačové vědě, potažmo teorii typů, se jako void označuje prázdný typ.
Podprogram bez návratové hodnoty
V některých jazycích pro imperativní programování se pomocí datového typu void deklarují funkce, které nevracejí návratovou hodnotu, ale volají se kvůli vyvolání příslušného vedlejšího účinku. Použití funkcí s návratovým typem void je v tomto ohledu srovnatelné se syntaktickými konstrukty v jiných programovacích jazycích, které v takovém případě používají speciální typ podprogramu (tzv. procedura), jako například v programovacím jazyce Visual Basic nebo Pascal.
V C a C++
Funkce vracející jako výsledek typ void končí buď dosažením konce funkce, nebo provedením příkazu return bez argumentu (bez vrácené hodnoty).
V jazyce C (a kvůli zpětné kompatibilitě je to možné použít též v C++) se také typ void používá pro definici bezparametrické funkce: pokud je jediným parametrem funkce nepojmenovaný parametr typu void, indikuje to, že funkce nepoužívá žádné parametry.[1]
V prvních verzích jazyka C přebírala funkce nevracející konkrétní výsledek implicitní návratový typ int
a funkce bez argumentů měla prostě prázdný seznam argumentů. Ukazatele na netypovaná data byla deklarována buď jako celá čísla (int
), nebo jako ukazatele na char
. Některé dřívější překladače jazyka C měly vlastnost, která je nyní považována za nepříjemnou, že generovaly upozornění při volání funkce, které nevyužilo vrácenou hodnotu. Starší kód proto používal přetypování takových volání na void, aby se toto upozornění potlačilo. V letech 1979—1980, kdy Bjarne Stroustrup začal pracovat na C++, byl datový typ void a ukazatel typu void již součástí dialektů jazyka C podporovaných překladači odvozenými od překladačů AT&T.[2]
Sémantika explicitního použití void
a naopak vynechání parametrů v prototypu funkce se mezi jazyky C a C++ liší, jak ukazuje následující tabulka:[3]
Význam | C | Ekvivalent v C++ |
---|---|---|
Funkce bez parametrů | void f(void) | void f() (preferované)
|
Konstantní, ale neznámý počet parametrů | void f() (od C99 zastaralé)[4] | žádný přesný ekvivalent, lze napodobit pomocí:
|
Ukazatel na void
Programovací jazyk C a C++ také podporují ukazatele na typ void (definováno jako void *
), což je ale použití stejného termínu pro nesouvisející význam. Proměnné tohoto typu jsou ukazatele na data blíže nespecifikovaného typu, takže v tomto kontextu (ale ne jinak) působí void *
zhruba jako univerzální ukazatel nebo zastřešující top typ. Program může převést data zpřístupněná takovým ukazatelem na libovolný datový typ (s výjimkou ukazatele na funkci) a zpět beze ztráty informací, což činí tyto ukazatele užitečné pro polymorfní funkce. Standardní jazyk C nezaručuje, že jiné typy ukazatelů mají stejnou velikost.
Prázdný typ
V teorii typů existuje typ, pro který neexistuje žádná hodnota. Tento prázdný typ (neboli spodní typ, bottom) se v některých programovacích jazycích (např. v Haskellu) označuje jako void (resp. Void
). (Naopak ekvivalentem typu void tak, jak je popsán výše, je ve funkcionálních jazycích jednotkový typ, unit, označovaný např. pomocí ()
.) Prázdný typ je podtypem všech typů. Prakticky se prázdný typ používá pro vyjádření návratového typu funkce, která nikdy nevrátí výsledek (např. protože se zacyklí), případně pro indikaci chyby či nemožné alternativy. Neexistuje žádná totální funkce do typu void (s triviální výjimkou unikátní funkce typu void→void).
Reference
V tomto článku byl použit překlad textu z článku Void type na anglické Wikipedii.
- ↑ ISO/IEC 9899:2017 („C17“), § 6.7.6.3.10
- ↑ https://web.archive.org/web/20130523224817/http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, "Standardisation."
- ↑ STROUSTRUP, Bjarne. Programming: Principles and Practice Using C++. Boston: Addison-Wesley, 2009. Dostupné online. ISBN 0-321-54372-6. S. 996.
- ↑ ISO/IEC 9899:1999 („C99“), § 6.11.6