Forum: PC-Programmierung Was macht "void myfun(void);"


von roman (Gast)


Lesenswert?

Hey Ho!

Ich habe eine Library geschrieben in C. Es kommt öfter vor dass da drin 
steht:
1
void myfun1(void);
2
void myfun2(void);
3
4
void myfun1(void) { functionbody };
5
void myfun2 (void) {functionbody };

Also es kommt eine Zeile (oder mehrere hintereinander) die aussehen wie 
eine Funktionsdeklaration ohne Body. Danach kommen die eigentlichen 
Funktionsdeklarationen - oder stehen irgendwo anders im Code.
Warum macht man das so? Was bringt das?

Ach ja: Ich hab keine Ahnung wie man das nennt  und dementsprechend 
finde ich nichts ...

Grüße

roman

von Hmm (Gast)


Lesenswert?

>Ich habe eine Library geschrieben in C.
>Ach ja: Ich hab keine Ahnung wie man das nennt  und dementsprechend
>finde ich nichts ...

Das scheint mir dermaßen widersprüchlich zu sein, das ich einen 
Trollversuch vermute. Oder erkläre den Widerspruch.

von Hmm (Gast)


Lesenswert?

Naja. Machen wir es kurz:

>Also es kommt eine Zeile (oder mehrere hintereinander) die aussehen wie
>eine Funktionsdeklaration ohne Body.
Nein. Das sind Funktionsdeklaration! Die haben per definition keinen 
Rumpf.

Was folgt, also mit Rumpf, sind "Funktions-Definitionen".

Aber lies mal für den Rest ein C-Buch.

von Michael H. (michael_h45)


Lesenswert?

Hmm schrieb:
>>Ich habe eine Library geschrieben in C.
>>Ach ja: Ich hab keine Ahnung wie man das nennt  und dementsprechend
>>finde ich nichts ...
>
> Das scheint mir dermaßen widersprüchlich zu sein, das ich einen
> Trollversuch vermute. Oder erkläre den Widerspruch.
Du kennst die Generation klicki-bunti wohl nicht.

roman schrieb:
> Ach ja: Ich hab keine Ahnung wie man das nennt  und dementsprechend
> finde ich nichts ...
Es heißt forward declaration.

von Hmm (Gast)


Lesenswert?

>Du kennst die Generation klicki-bunti wohl nicht.

Tja. Nichts scheint im Zeitalter des Internets näher zu liegen, als der 
nächste Dummbeutel, der einem die Arbeit des lernens und nachschlagens 
abnimmt.

von roman (Gast)


Lesenswert?

Ah .. Sorry:

Ich habe eine Library (sie ist) geschrieben in C.
Das heißt nicht: Ich habe eine Library in C geschrieben.

Die Lib ist nicht von mir, sonst hätte ich ja wohl gewusst warum ich das 
da hinschreibe.


Aber vielen Dank, jetzt weiß ich wonach ich suchen muss .. vielleicht 
finde ich den Sinn auch noch raus die Funktion zu deklarieren und sie 
später dann zu definieren.

Grüße

von Udo S. (urschmitt)


Lesenswert?

roman schrieb:
> ber vielen Dank, jetzt weiß ich wonach ich suchen muss

Geh zu einer Unibücherei oder zu amazon und suche nach einem C BUCH!
Und LESE es!

von Torwin (Gast)


Lesenswert?

Roman,schlage nach, wozu  *.c und *.h Datei-Enden in einem C-Programm 
verwendet werden. vieleicht bringt dich das weiter.
Kleiner Tipp: h(header), c(code).

von Hmm (Gast)


Lesenswert?

>Ich habe eine Library (sie ist) geschrieben in C.

Aha. Nun gut. Das sind eigentlich zwei verschieden Aussage und Sätze.
1. Ich habe eine Library.
2. Die Library ist in C geschrieben.

Um das hintereinander schreiben zu können und den Sinn zu erhalten sind 
die Interpunktion und die Gross-Schreibung erfunden worden.

"Ich habe eine Library. Sie ist in C geschrieben."

Man kann daraus, wiederrum mithilfe der Interpunktion, auch einen 
einzigen Satz machen. Hier kommt das sogenannte Komma in's Spiel.

"Ich habe eine, in C geschriebene, Library."

>vielleicht finde ich den Sinn auch noch raus die Funktion zu deklarieren >und sie 
später dann zu definieren.

Nun. Der Präzedenzfall ist folgender. Nimm an, Du willst eine rekursive 
Funktion schreiben, die nicht int als Resultat hat und nicht int als 
Parameter. Wie machst Du das ohne Warnung oder gar Fehlermeldung?

von roman (Gast)


Lesenswert?

Wäre die Deklaration in der .h und die Definition in der .c gewesen 
hätte ich mir einen Reim daraus machen können.

Die Beschriebenen Deklarationen und Definitionen stehen hier quasi als 
Blöcke direkt untereinander.

Gerade noch einmal geprüft: Keine der Funktionen ist rekursiv. Der Code 
kompiliert und funktioniert auch ohne die forward declaration.
Der Sinn erschließt sich mir an dieser Stelle nicht, aber das macht ja 
auch nichts.
Da es auch so funktioniert nehme ich an es wäre auch nicht nötig gewesen 
und man macht es wohl aus konvention.


Vielen Dank auch für die hilfreichen Tips ein Buch zu lesen. Ich habe 
bereits ein Buch und einige Tutorials gelesen, aber nur vom Lesen hat 
mans auch auch nicht gleich gefressen - oder? Die meisten Fragen stellen 
sich beim Erfahrungen sammeln. Ich hätte ja auch gerne nachgeschlagen 
aber ich habe nichts gefunden weil mir der Begriff dazu gefehlt hat. In 
den Einsteigerkapiteln sind die Funktionsdeklarationen gleich mitsamt 
der Definition zu finden und in den einschlägigen C-Lernbüchern schreibt 
ja auch niemand gleich eine Bibliothek! Also cool bleiben, keiner lernt 
jemals ohne nachzufragen ...

Grüße

von Hmm (Gast)


Lesenswert?

>Also cool bleiben

Wir sind cool. Warum sollen wir uns aufregen? Du hast ja das Problem und 
nicht wir.

Das Problem, ist erstmal das Du uns nur einen Codeausschnitt gepostet 
hast und nicht den kompletten Code bzw. einen Link darauf. Wir wissen 
also nicht ob es sich hier um eine unnötige Vorwärtsdeklaration handelt 
oder nicht. Wir gehen also erstmal davon aus, das sie notwendig ist.

Ich habe auch nicht geschrieben, das rekursive Funktionen der einzige 
relevante Fall sind. Nur das es sich um einen Präzedenzfall handelt, 
denn Du hast gefragt:

>Warum macht man das so? Was bringt das?

und nicht: Warum ist das in diese Code so?
Wenn Du so gefragt hättest wäre es nämlich notwendig gewesen den 
gesamten Code zu sehen, um antworten zu können.

So aber blieb uns nur, eine allgemeine Antwort zu geben.

>Der Code kompiliert und funktioniert auch ohne die forward declaration.
Schön. Dann wissen wir jetzt das die Vorwärtsdeklaration unnötig war. 
Aber das konnten wir nicht erkennen. Oder sagst Du mir, woran wir das 
hätten sehen sollen?

Du bist also selbst dafür verantwortlich wenn Du Antworten erhalten hast 
die nicht unmittelbar die Notwendigkeit klären konnten.

von roman (Gast)


Lesenswert?

Aber das hab ich doch gar nicht gemeint.

Meine Frage war: Warum macht man das so und was bringt das?
Diese Frage hast du direkt beantwortet als du geschrieben hast man nennt 
es "forward declaration" (danke nochmal)

Das mit dem Präzedenzfall habe ich auch verstanden, keine Sorge.

Das weiter unten war mehr eine Diskussion, ich wollte damit sagen: Es 
ist offensichtlich in meinem Fall überflüssig, was vielleicht ein wenig 
auch mitschuld war dass ich nicht draufgekommen bin wo ich suchen muss.

Ich habe die notwendige Antwort bekommen und ich wollte sie auch nciht 
auf meinen Code bezogen haben sondern allgemein, also alles in Butter.

Danke!

von Karl H. (kbuchegg)


Lesenswert?

roman schrieb:
> Aber das hab ich doch gar nicht gemeint.
>
> Meine Frage war: Warum macht man das so und was bringt das?

Vielleicht hat der Library-Schreiber ganz einfach die Funktionen in der 
Urversion nicht im Header File gehabt, sondern in einem seperaten 
C-File. Als er dann die Funktionen ins Header File gezogen hat, um 
inlining zu ermöglichen, hat er ganz einfach auf die Deklarationen 
vergessen und sie sind drinn geblieben.

Wenn du weißt, was eine Deklaration ist und warum man die braucht, dann 
weißt du auch, dass eine derartige Deklaration ja nicht stört.
Also einfach mal davon ausgehen, dass derjenige, von dem du den Code hat 
auch mal Fehler macht, die ihm nicht aufgefallen sind.

von Blackbird (Gast)


Lesenswert?

Und wenn man sich nicht sicher ist, wie, wo und warum etwas so 
geschrieben ist ... dann kann man es immer noch probeweise weglassen und 
dann die Compiler-/Linker- Warnings und -Errors aufmerksam lesen ....


Blackbird

von Mike M. (mikeii)


Lesenswert?

Blackbird schrieb:
> Und wenn man sich nicht sicher ist, wie, wo und warum etwas so
> geschrieben ist ... dann kann man es immer noch probeweise weglassen und
> dann die Compiler-/Linker- Warnings und -Errors aufmerksam lesen ....
>
>
> Blackbird

Naaaja, man sollte schon wissen was man tut, der Compiler weiß auch 
nicht alles

von heinz (Gast)


Lesenswert?

>dass eine derartige Deklaration ja nicht stört.

Dient mMn der besseren Uebersicht, ob man Sie jetzt braucht oder nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.