23. september 2005 - 02:15Der er
8 kommentarer og 1 løsning
Erklæring af 2 funktioner der kalder hinanden
Jeg har 2 funktioner, der, hvis visse betingelser er opfyldt, hver især skal kalde den anden (og nej, det bliver ikke uendelig løkke, det er jeg sikker på).
Mit problem er så, at jeg får fejl når den første funktion kalder den anden, fordi den anden først bliver erklæret længere nede i koden.
F.eks.
void func1() { // Noget kode func2(); }
void func2() { // Noget kode func1(); }
Så får jeg følgende 2 fejlmeddelelser:
error: conflicting types for 'func2' error: previous implicit declaration of 'func2' was here
jep... problemet er at når compileren render ind i kaldet til func2() oppe i func1() så går den ud fra at det er en function der returnerer en int... og da det ikke er tilladt at definere flere functioner med samme navn men med forskellige return-typer, så vil compileren brokke sig når den møder definitionen af func2.
Du bliver nødt til at lave en funktionserklæring oppe i toppen - generelt er det en god ide at gøre det til alle funktioner, også selvom dette problem ikke umiddelbart opstår... og så bør det gøres i en header-fil, så får du jo også mulighed for at kalde dine funktioner fra andre .c filer
Men hvad er den dybere mening så med funktionserklæringer? Det virker jo lidt som dobbeltkonfekt at erklære navn og returtype 2 steder. Men er det for at kunne bruge funktionerne fra andre C filer som nævnt?
Tjaeh, den præcis grund er vel lidt svær at regne ud... og sprog som Java og C# har jo elimineret det trin, så det er da ikke helt umuligt at lave et programmeringssprog som ikke kræver funktionserklæringer.
Men der er nok alligevel en eller anden god grund til det. Der er jo nogle ting i C/C++-byggeprocessen som adskiller sig lidt fra de to førnævnte sprog.
Men umiddelbart, som programmør og Udøver Af God Kodestil, vil det jo være en god ide altid at lave en header-fil indeholdende erklæringer af samtlige funktioner i den tilhørende .c/.cpp-fil.
>mookid, at lave prototyper for ALLE funktioner i header filer er nok ikke nogen god idé, der findes static functioner der kun skal kunne kaldes fra samme c/cpp fil.
I C++ (men ikke C) skal kompileren kunne se hvordan funktioner den vil kalde ser ud. Så enten skal man have funktionen før man kalder den, eller man skal have en prototype.
>bertelbrander, i C skal compileren også se det, ellers går den jo ud fra at funktionen returnerer en int - og det kan give rimelig mystiske resultater når man så f.eks. laver en funktion der returnerer en float, for så bliver denne float jo casted til int, re-interpret style
og så lige en lille kommentar til det med static - der er jo to betydninger af static...
Det er klart at hvis en "fri" funktion er erklæret static, sådan at den kun kan kaldes fra den samme .c/.cpp-fil som den er defineret i, så vil man nok ikke lave en header-fil som skal kunne inkluderes alle vegne
Derimod når static er til statiske funktioner og data i en struct eller klasse så vil en header-fil jo nok altid være en rigtig god ide
I C SKAL man ikke have en prototype, men ja, det kan give sære resultater hvis man ikke har det.
Med static functioner mente jeg static ikke member funktioner.
På samme måde som man ikke erklærer class'er og struct's i headerfiler medmindre at de skal bruges af mere end én cpp fil, erklærer (dvs laver prototyper) man ikke funktioner i header filer. Det samme gælder variabler og andre typer.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.