Prototyp funkce

V dřívějších verzích jazyka C, pokud funkce nebyla předem deklarována a její jméno se vyskytovalo ve výrazu následovaném levou závorkou, byla implicitně deklarována jako funkce, která vrací int, a o jejích argumentech se nic nepředpokládalo. V takovém případě by překladač nebyl schopen provést při kompilaci kontrolu typů argumentů a arity syntaxe, pokud by byla funkce aplikována na některé argumenty. To může způsobit problémy. Následující kód ilustruje situaci, kdy 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 jejím volání bude celočíselný argument na zásobníku nebo v registru. Pokud je prototyp vynechán, překladač to nemá jak vynutit a MyFunction bude nakonec pracovat s nějakým jiným údajem na zásobníku (případně s návratovou adresou nebo hodnotou proměnné, která momentálně není v oboru). Zahrnutím prototypu funkce informujete kompilátor, že funkce MyFunction přijímá jeden celočíselný argument, a umožníte kompilátoru zachytit tyto druhy chyb a zajistit hladký průběh kompilace. Tato funkce byla ze standardu C99 odstraněna, takže vynechání prototypu funkce bude mít za následek chybu při kompilaci.

Vytváření rozhraní knihovenUpravit

Umístěním prototypů funkcí do hlavičkového souboru lze specifikovat rozhraní pro knihovnu.

Deklarace třídUpravit

V jazyce C++ se prototypy funkcí používají také v definicích tříd.

V C++ se prototypy funkcí používají také v definicích tříd.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.