Prototyp funkce - Function prototype
V programování počítače , je prototyp funkce nebo funkce rozhraní je prohlášení o funkci , která určuje jméno a funkce je druh podpis ( arity , datové typy z parametrů a návratový typ ), ale vynechává funkci těla. Zatímco definice funkce určuje, jak funkce dělá to, co dělá („implementace“), prototyp funkce pouze specifikuje své rozhraní, tj. Jaké datové typy vstupují a vystupují. Termín prototyp funkce se používá zejména v kontextu programovacích jazyků C a C ++, kde umisťování dopředných deklarací funkcí do hlavičkových souborů umožňuje rozdělení programu na překladové jednotky , tj. Na části, které může kompilátor samostatně přeložit do objektových souborů . spojeno linkerem do spustitelného souboru nebo knihovny .
V prototypu jsou názvy parametrů volitelné (a v C/C ++ mají rozsah funkčních prototypů, což znamená, že jejich rozsah končí na konci prototypu), typ je však nezbytný společně se všemi modifikátory (např. Pokud se jedná o ukazatel nebo odkaz na parametr const ), kromě samotného const.
V objektově orientovaného programování , rozhraní a abstraktní metody slouží hodně stejný účel.
Příklad
Zvažte následující prototyp funkce:
void Sum( int a, int b );
NEBO
void Sum( int, int );
Prototypy funkcí v první řadě zahrnují podpis funkce, název funkce, typ návratu a specifikátor přístupu. V tomto případě je název funkce „Součet“. Podpis funkce určuje počet parametrů a jejich typy. Ve výše uvedeném příkladu je návratový typ „neplatný“. To znamená, že funkce nevrátí žádnou hodnotu. Názvy parametrů v prvním příkladu jsou volitelné.
Využití
V dřívějších verzích C, pokud funkce nebyla dříve deklarována a její název se vyskytoval ve výrazu následovaném levou závorkou, byla implicitně deklarována jako funkce, která vrací int
a o jejích argumentech se nepředpokládalo nic. V tomto případě by kompilátor nemohl provést kontrolu platnosti kompilace počtu a typů argumentů, což může způsobit problémy. Následující kód ukazuje situaci, ve které je chování implicitně deklarované funkce nedefinované .
#include <stdio.h>
/* If this prototype is provided, the compiler will catch the error in
* |main|. If it is omitted, then the error may go unnoticed.
*/
int MyFunction(int n); /* Prototype */
int main( void ) /* Calling function */
{
printf("%d\n", MyFunction()); /* Error: forgot argument to MyFunction */
return 0;
}
int MyFunction( int n ) /* Called function definition */
{
if (n == 0)
{
return 1;
}
else
{
return n * MyFunction(n - 1);
}
}
Funkce MyFunction očekává, že při volání bude celočíselný argument v zásobníku nebo v registru . Pokud je prototyp vynechán, kompilátor to nebude moci vynutit a MyFunction skončí v provozu na nějakém jiném datu v zásobníku (možná návratová adresa nebo hodnota proměnné, která aktuálně není v rozsahu ). Zahrnutím prototypu funkce informujete kompilátor, že funkce MyFunction přebírá jeden celočíselný argument a povolíte kompilátoru zachytit tyto druhy chyb a zajistit hladký průběh procesu kompilace. Tato funkce byla odebrána ze standardu C99 , takže vynechání prototypu funkce bude mít za následek chybu kompilace.
Vytváření rozhraní knihovny
Umístěním prototypů funkcí do souboru záhlaví lze určit rozhraní pro knihovnu .
Třídní prohlášení
V C ++ se prototypy funkcí používají také v definicích tříd .
Viz také
Reference
- Kernighan, Brian W .; Ritchie Afree, Dennis M. (1988). Programovací jazyk C (2. vydání). Upper Saddle River, New Jersey: Prentice Hall PTR. ISBN 0-13-110362-8.