Forum: PC-Programmierung Wie/wann benutzt man weitere .c bzw.h dateien?


von Lars Ding. (Gast)


Lesenswert?

Hallo Forum,

ich beschäftige mich seit kurzem mit C. Daher eine etwas anfängerliche 
Frage:

Ich möchte gerne Funktionen auslagern. Wie macht das üblicherweise in C 
? Packt man die in eine Headerfile oder in eine weitere .c File? Wann 
wählt man eine .c oder .h file?

In diesem Tutorial hier: 
http://www.c-howto.de/tutorial-praeprozessor-dateien-einbinden.html

werden Funktionen in die Headerfile ausgelagert. Macht man das immer so? 
Wann und wie benutzt man dann eine weitere .c file?

Ich bedanke mich :) !

Lg

von Karl H. (kbuchegg)


Lesenswert?

Du benutzt grundsätzlich eigene C-Files für deine Funktionen. Denn der 
Sinn besteht darin, dass jedes C-File für sich alleine kompiliert werden 
kann, ohne Ansehen der anderen.

Hast du daher 2 Millionen Funktionen, dann bringt es dir nichts, wenn du 
die in Header Files auslagerst, ausser der bessern Übersicht. Da könnte 
man gleich alles in einem File lassen, wenn dann im Hauptrpgramm sowieso 
erst recht wieder alle 2 Millionen Funktionen compiliert werden müssen. 
Egal ob sie jetzt direkt drinnen stehen, oder ob sie über einen Include 
reingezogen werden.

Aber: Stecken die Funktionen modulweise in ihren jeweiligen C-Files, 
dann wird bei einer Änderung nur dieses eine Modul neu kompiliert. Das 
sind dann vielleicht 10 oder 20 Funktionen von den 2 Millionen. Mit den 
anderen Funktionen muss nichts gemacht werden (sofern sie von der 
Änderung nicht betroffen sind), die brauchen daher nicht neu compiliert 
werden.

Siehe auch:
## FAQ ##
Header_File, wie geht das?

von Karl H. (kbuchegg)


Lesenswert?

PS:

Aus deiner Verlinkung
1
Meistens werden die Unter-Funktionen in separate Dateien - sogenannte
2
Header-Dateien - ausgegliedert.

Das ist eine grob fahrlässige Verzerrung der Situation. Es gibt Fälle, 
in denen man Funktionen im Header File lässt. Wenn es gute Gründe dafür 
gibt, die Funktion kurz ist und man dem Compiler die Gelegenheit geben 
möchte ein Funktions-inlining durchzuführen. Aber das ist nicht der 
Regelfall sondern die Ausnahme. Und man muss dann auch den Regeln nach 
spezielle Vorkehrungen treffen. So wie es da steht, ist das grob 
fahrlässig falsch vereinfacht dargestellt.

von Karl H. (kbuchegg)


Lesenswert?

Ich hab ein wenig in diesem C-Howto geschmökert.

Kauf dir lieber ein Buch!(*) Da hast du mehr davon.
Dieses Tutorial ist genau von der Sorte: die hälfte steht nicht drinnen, 
und bei dem was drinnen steht ist so manches zweifelhaft beschrieben bzw 
falsch. Ein gutes C-Buch hat nicht ohne Grund rund 200 DIN-A4 Seiten und 
wird vom Autor, vom Lektor und von guten Programmierkollegen Korrektur 
gelesen.


(*) aber bitte nicht sein Buch.
Denn da steht genau dasselbe drinnen, wie hier online. Mit natürlich 
genau denselben Fehlern und Ungenauigkeiten.

von Sam P. (Gast)


Lesenswert?

Noch ein kleiner Tipp für die Fragen "Wann?" und "Warum?":

Mach erstmal alles in einer einzigen C-Datei. Wenn du neu bist, hast du 
reichlich Baustellen, spar dir diese. Wächst dein Programm, wirst du 
selber merken, dass das irgendwann unübersichtlich wird. Das ist ein 
guter Zeitpunkt, deine Funktionen thematisch sortiert auf mehrere 
C-Dateien aufzuteilen, und dann musst du auch zu jeder C-Datei eine 
passende H-Datei mit den Funktionsprototypen erstellen.

Ein zweiter guter Grund wäre, wenn du ein zweites Programm schreibst und 
Funktionen hast, die in beiden Programmen benutzt werden sollen.

von Lars Ding. (Gast)


Lesenswert?

Hallo nochmal.

Erstmal vielen Dank euch :)

Ja das C-Howto ist nicht so das wahre. Hab mal quer im Netz gesucht, da 
mir das ganze in "The C Programming Language" doch etwas zu knapp 
beschrieben war. Der Verweis auf das FAQ hilft mir sehr weiter.

Ich danke euch.

Lg

von amateur (Gast)


Lesenswert?

Für Anfänger gibt es noch einen kleinen Trick:
Sinnvoll ist der aber nur, wenn Du Funktionen abgeschlossen hast und 
nichts mehr daran machen willst.
Der Hauptgrund aber ist: Ich möchte mich nicht jedes mal durch 800 
Zeilen hangeln.
Hierzu markierst Du Dir einen beliebigen Block, kopierst ihn in eine 
eigene .c-Datei, löscht ihn und fügst an der Entnahmestelle eine 
include-Anweisung mit dem Namen der Auslagerungsdatei ein. Eventuell mit 
vollständigem Pfad.
Ein Graus für C'ler aber recht einfach.

von Klaus (Gast)


Lesenswert?

amateur schrieb:
> Für Anfänger gibt es noch einen kleinen Trick:
> Sinnvoll ist der aber nur, wenn Du Funktionen abgeschlossen hast und
> nichts mehr daran machen willst.
> Der Hauptgrund aber ist: Ich möchte mich nicht jedes mal durch 800
> Zeilen hangeln.
> Hierzu markierst Du Dir einen beliebigen Block, kopierst ihn in eine
> eigene .c-Datei, löscht ihn und fügst an der Entnahmestelle eine
> include-Anweisung mit dem Namen der Auslagerungsdatei ein. Eventuell mit
> vollständigem Pfad.
> Ein Graus für C'ler aber recht einfach.

Hör bitte auf so ein Unfug zu verbreiten. Mehr kann man dazu eigentlich 
nicht sagen. Außer dass es vielleicht gut wäre, wenn DU dir auch mal 
ein C-Buch kaufst, die Mods deinen Schmarrn löschen bevor das noch 
jemand glaubt.

von DirkB (Gast)


Lesenswert?

Denke aber daran, die .c auch in deinem Projekt/Makefile einzutragen.
Sonst beschwert sich der Linker.

von Karl H. (kbuchegg)


Lesenswert?

Klaus schrieb:

> Hör bitte auf so ein Unfug zu verbreiten. Mehr kann man dazu eigentlich
> nicht sagen. Außer dass es vielleicht gut wäre, wenn DU dir auch mal
> ein C-Buch kaufst, die Mods deinen Schmarrn löschen bevor das noch
> jemand glaubt.

Habs jetzt erst gesehen.
Wenn ich es rauslösche, wird der Ruf nach Zensur wieder laut. Die 
entsprechende Antwort auf den Vorschlag wurde ja schon gegeben. Dem ist 
nichts hinzuzufügen.

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.