Funkcje, są to podprogramy wykonujące konkretne zadanie, które mogą zostać wywołane przez inne podprogramy. Można do nich przekazywać parametry, na których zostaną wykonane jakieś działania, mogą również zwrócić różnego rodzaju wartości. Zawsze, kiedy w programie mamy jakiś powtarzający się kod, warto z niego stworzyć funkcję. Ułatwia to edycję programu oraz powoduje, że program staje się bardziej czytelny i zwięzły.
DEKLARACJA FUNKCJI
Przekazuje kompilatorowi informacje o funkcji: nazwa funkcji, typ wartości przekazywanej przez funkcję,typy parametrów przekazywanych do funkcji. Deklaracja nie jest właściwą zawartością funkcji. Ogólna składnia deklaracji (prototypu) funkcji wygląda następująco:
typ identyfikator(parametry);
gdzie typ określa rodzaj zwracanej przez funkcję wartości [dowolny, oprócz tablicy i funkcji], identyfikator, to nazwa funkcji, jaką będziemy ją wywoływać, a opcjonalny parametr parametry określa parametry, jakie mają zostać przekazane do programu, np:
float obwod(char znak);
Jeśli nie podamy typu zwracanej wartości, domyślnie zostanie on określony jako int. Listę parametrów podajemy po przecinku (w nawiasie). Jeśli funkcja nie przyjmuje żadnych parametrów, w nawiasach piszemy void. Przy określaniu listy parametrów, identyfikatory są niekonieczne, jednak dobrym zwyczajem jest ich pisanie. Można również przy ich deklaracji użyć słowa const, które gwarantuje, że wartość wskazanych danych nie zostanie w funkcji zmieniona. Oto kilka poprawnych przykładów:
char funkcja1(char);
void funkcja2(int a, char znak);
funkcja3(void);
int funkcja4(const int liczba);
DEFINICJA FUNKCJI
W definicji funkcji podajemy właściwy jej kod, czyli poszczególne instrukcje. Ogólna uproszczona składnia wygląda tak:
typ nazwa_funkji([lista_parametrów])
{
...ciało_funkcji...
}
typ - typ wartości zwracanej przez funkcję
lista_parametrów - podana po przecinku liczba parametrów przekazywanych podczas wywoływania funkcji
ciało_funkcji - właściwy kod funkcji (blok programu)
Definicja funkcji musi zgadzać się z jej deklaracją.
Ogólna składnia funkcji wygląda następująco:
[specyfikator1] typ [specyfikator2] nazwa_funkji([lista_parametrów])
{
...ciało_funkcji...
}
Jak widać pojawiły się dwa opcjonalne dodatkowe parametry:
Specyfikator1 - mogą to być słowa: extern (oznacza, że funkcja ma być dostępna również w innych modułach programu), static (funkcja będzie dostępna tylko w obrębie modułu), inline (oznacza wstawienie we wskazany adres kodu funkcji, a nie wywołanie skoku).
Specyfikator2 może przyjąć szereg różnych wartości: near - oznacza, że wywołanie funkcji odbywa się w sposób bliski, far - daleki, huge - daleki z unormowaniem adresu. Może tu być również słowo: pascal oznacza, że parametry przekazywane są tak jak w pascalu (szybsze), cdecl - parametry przekazywane tak jak we właściwym C. Istnieją jeszcze parametry: interrupt, który określa, że funkcja będzie obsługiwać przerwania; _loadds - oznacza, że w czasie wywołania funkcji rejestr DS będzie zawierał adres aktualnego segmentu danych; _saveregs - powoduje, że wywołanie funkcji nie zmieni wartości rejestrów.
return jest instrukcją kończącą funkcję i przekazującą wartość o typie zadeklarowanym w typie funkcji.Np.:
int suma_liczb(int a, int b)
{
return a+b;
};