Void (programování)

Název void (anglicky prázdný) v programovacích jazycích označuje absenci typu. V jazycích odvozených od jazyka C je void klíčové slovo, které se používá pro vyjádření, že funkce nevrací žádný typ, nemá žádné parametry, nebo že se jedná o obecný ukazatel, bez uvedení, na jaký typ ukazuje. V jazyce ALGOL68 se void používá na místě návratového typu procedury a pro vyjádření, že program je samostatný. Ve funkcionálních jazycích (např. v Haskellu) a teoretické počítačové vědě, potažmo teorii typů, se názvem void označuje prázdný typ.

Podprogram bez návratové hodnoty

V některých jazycích pro imperativní programování se pomocí klíčového slova void deklarují funkce, které nevracejí návratovou hodnotu, ale volají se kvůli vyvolání příslušného vedlejšího účinku. Použití void na místě návratového typu funkce 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 v jejichž deklaraci nebo definici je jako návratový typ uvedeno 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 klíčové slovo void používá také na místě seznamu parametrů pro definici funkce, která nemá žá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ýznamCEkvivalent v C++
Funkce bez parametrůvoid f(void)void f() (preferované)

void f(void)

Konstantní, ale neznámý počet parametrůvoid f() (od C99 zastaralé)[4]žádný přesný ekvivalent, lze napodobit pomocí:

template <typename... Ts> void f(Ts... ts)

Ukazatel na void

V programovacích jazycích C a C++ se používají ukazatele na typ void (psáno void *) pro 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 voidvoid).

Reference

V tomto článku byl použit překlad textu z článku Void type na anglické Wikipedii.

  1. ISO/IEC 9899:2017 („C17“), § 6.7.6.3.10
  2. https://web.archive.org/web/20130523224817/http://cm.bell-labs.com/cm/cs/who/dmr/chist.html, "Standardisation."
  3. STROUSTRUP, Bjarne. Programming: Principles and Practice Using C++. Boston: Addison-Wesley, 2009. Dostupné online. ISBN 0-321-54372-6. S. 996. 
  4. ISO/IEC 9899:1999 („C99“), § 6.11.6