Miért kell deklarálni egy függvényt?
Ha jól értem akkor ha megadjuk egy függvény definícióját a meghívás előtt akkor nem kell deklarálni. De milyen előnye van annak ha előre deklaráljuk?
Ezt találtam de nem értet: "Ebben az esetben fölöslegessé válik a deklaráció. Bár ez a módszer kis méretű programok esetében kiválóan használható, azért követendőnek semmiképpen nem nevezhető. Nagyobb programoknál ugyanis komoly problémákba ütközhetünk, ha a végrehajtás és a lefordíthatóság a függvények definíciójának sorrendjétől kezd függni. Összetett kódok esetében ilyenkor kibogozhatatlan függőségek alakulhatnak ki és soha nem lehetünk benne biztosak, hogy minden a megfelelő helyen és a megfelelő sorrendben van. Sokkal hasznosabb, ha mindent jó előre deklarálunk, hiszen a definíciók sorrendjétől való függést így automatikusan kiküszöböljük. "
Azért kell előre deklarálni, mert a kód soronként kerül feldolgozásra, a függvényhívások, hol melyik függvényre hivatkozik valami sorról sorra van inicializálva. Ezért a fordító minden ponton csak azt érzékeli, arról van tudomása, amit előtte már deklaráltál. És ha a fordító elér egy olyan sorhoz, ahol olyan függvényt hívsz meg, amit addig nem deklaráltál, akkor bizony gebasz van, mert nem tudja hova kötni amit ott talál. Még húzósabb probléma, ha használsz overloadingot, esetleg template paramétereket is, és egy függvénynek 'több változata' is van a kódodban. Mondjuk van egy sor a kódban, ahol a Foo függvény B változatát akarod meghívni, de addig a pontig csak a A változatát deklaráltad/definiáltad. Ekkor a fordító értelemszerűen az A változathoz fogja kapcsolni amit talál, és nem is fog feltétlenül hibát jelezni neked. Csak utólag fog feltűnni, hogy futás közben valami nem stimmel.
Ezért szokás a függvényeket jó előre deklarálni.
Amit idéztél, abban világosan ott van.
Jó szokás deklarálni azért, mert csak definíciónál figyelni kell a sorrendre: azaz ha a függvényeid egymást hívják (ami eléggé gyakori eset, kapásból a mainnel kezdve), akkor sorba kell őket rakni, ha pedig ketten egymást hívják, akkor deklaráció nélkül meg se tudod oldani.
A másik fontos ehhez még, hogy a header fájlokban általában csak deklaráció van rengeteg okból (pl. hogy ne kelljen mindig újra buildelni olyan függvényeket, amiken nem is változtatsz), és azok sem működnének enélkül.
"Ekkor a fordító értelemszerűen az A változathoz fogja kapcsolni amit talál, és nem is fog feltétlenül hibát jelezni neked."
Mutatnál nekem erre egy példát?
#4
Szerintem ilyesmire gondolt:
void Foo(int);
//void Foo(short);
int main()
{
Foo(short(0));
std::cin.get();
}
void Foo(int)
{
std::cout << "int\n";
}
void Foo(short)
{
std::cout << "short\n";
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!