Egy függvény a programozásban vagy egy szubrutin egy programkód darab, amely a program egy másik helyéről elérhető . A legtöbb esetben az azonosító egy függvényhez van társítva , de sok nyelv engedélyezi a névtelen függvényeket is . A függvényben szereplő első utasítás ( operátor ) címe, amelyre a függvény meghívásakor a vezérlés átkerül, elválaszthatatlanul kapcsolódik a függvénynévhez . A függvény végrehajtása után a vezérlés visszatér a visszatérési címre, a program azon pontjára, ahol a függvényt meghívták.
A függvény paramétereket vehet fel, és valamilyen értéket kell visszaadnia, esetleg üresen. Az üres értéket visszaadó függvényeket gyakran eljárásoknak nevezik . Egyes programozási nyelvekben a függvény- és eljárásdeklarációk eltérő szintaxissal rendelkeznek, különösen különböző kulcsszavak használhatók.
A függvényt megfelelően deklarálni és definiálni kell . A függvénydeklaráció a név mellett tartalmazza a paraméterek (vagy: argumentumok) neveinek és típusainak listáját, valamint a függvény által visszaadott érték típusát. A függvénydefiníció tartalmazza a függvény végrehajtható kódját. Egyes programozási nyelvekben a függvény deklarálása közvetlenül megelőzi a függvény definícióját, míg számos más nyelvben először deklarálni kell a függvényt, és csak ezután kell megadni a definícióját.
Az objektum-orientált programozásban azokat a függvényeket, amelyek deklarációi az osztálydefiníció szerves részét képezik , metódusoknak nevezzük . Az OOP nyelvekben is lehetséges egy absztrakt (virtuális) függvény deklarálása a függvénytörzs deklarálása nélkül.
Egy korábban definiált függvény használatához szükséges a programkód kívánt helyén feltüntetni a függvény nevét és felsorolni a függvénynek átadott paramétereket. A függvénynek átadott paraméterek értékkel és hivatkozással is átadhatók: egy lokális másolat jön létre az érték által átadott változóhoz, és minden változás, amely a függvény törzsében az átadott változóval együtt történik, valójában lokális másolat, és semmilyen módon nem érinti magát a változót, míg a függvénytörzsben a hivatkozással átadott változóban bekövetkező változások magára az átadott változóra vonatkoznak.
A függvény meghatározza a saját (lokális) hatókörét, amely magában foglalja a bemeneti paramétereket, valamint azokat a változókat, amelyek közvetlenül a függvény törzsében vannak deklarálva.
Magán a függvényen belül is meg lehet hívni egy függvényt: az ilyen függvényhívást rekurzívnak , az egymást követő beágyazott függvényhívások folyamatát pedig rekurziónak nevezzük . Mivel meg kell emlékezni (a veremben) a függvény visszatérési címére (és ugyanabban a veremben le kell foglalni a memóriát a nem dinamikus paraméterek és helyi változók számára), ezért a korlátlan rekurzió verem túlcsorduláshoz vezet , ezért a programozásban nyelvek esetén a rekurzív hívások egy bizonyos maximális egymásba ágyazási szintet állítanak be.
a C++ szabványban is vannak alapértelmezett argumentumokkal rendelkező függvények
void foo ( int arg1 , int arg2 = 10 ) { cout << arg1 << arg2 ; } foo ( 9 ); // lesz hívva, és megjelenik a 910vagy ami ugyanaz (lásd az első osztályú függvényeket és a lambda függvényeket ):
val név = fn t => print t