Unterschied Makefiles und #include
-
Hallo zusammen,
worin besteht eigentlich der konkrete Unterschied, ob ich eine Datei mittels #include einbinde, oder ob ich im Makefile angebe, dass sie mit einer anderen übersetzt werden soll?
Gruß,
LukeSkywalker
-
naja, includen kannst du header.
makefiles sind dazu da, große projekte mit vielen code-dateien einfacher zu compilen.... mit headern haben makefiles wenig zu tun
-
Hallo,
ja schon, aber ich kann ja auch C-Dateien einbinden
Gruß,
LukeSkywalker
-
weiss nicht ob das geht, aber selbst wenn, macht man das nicht.
-
waenn du headers verwaendest ist sicher besser da es die übersichtlichkeit foerdert!!!!!!
-
Makefiles sind mehr als nur includes.
Stell dir vor du hast eine Anwendung mit 100 c Dateien. Und die wären alle in die main.c #includiert.
Jetzt müsstest du jedesmal _alle_ Dateien neu kompilieren nur weil du irgendwo ganzen hinten im letzten Eck einen punkt gemacht hast... Das wäre doof.Man will lieber dass nur das nötige erstellt wird: hier kommen Makefiles in Spiel.
Du sagst im makefile was wovon abhängt und so wird immer nur das nötigste erstellt. idR bietet eine gute IDE aber etwas bequemeres als makefiles an...
-
LukeSkywalker schrieb:
Hallo,
ja schon, aber ich kann ja auch C-Dateien einbinden
Gruß,
LukeSkywalkerNur theoretisch:
Ein header ist dazu gedacht, in mehreren C Dateien eingebunden zu werden, was impliziert, daß ein Header nur Deklarationen enthalten darf, also niemals Definitionen. Zum Unterschied siehe hier:
extern void eine_funktion(); // Deklaration void eine_funition() { // Definition ... }
Wenn Du also eine .c Datei einbindest:
1. Darf sie nur deklarationen enthalten. In diesem Fall nennt man sie aber gemeinhin "Header" und sie hat per Konvenition dann die Endung .h (oder .hh, .H, .hpp in C++). MaW du hast in diesem Fall keine echte Header atei. Oder:
2. Die Datei wird nur in einer Datei includiert. Dann stellt sich aber wohl zu recht die Frage, warum du so komplizierst die Datei inkludierst und nicht einfach eine Datei draus machst.
3. Abgesehen davon veränderst Du mit dem Includieren von C Definitionen ggf. deren Sichtbarkeit (static), wodurch plötzlich Kompilerfehler auftreten können (doppelte Symbole).
-
Hallo zusammen,
danke für Eure Antworten. Es ist ganz klar, dass Makefiles übersichtlicher und besser zu organisieren sind. Ich stelle mir nur die Frage, ob ich praktisch etwas anderes tue.
Gruß,
Luke
-
naja, wenn du keinen bock auf makefiles hast nimm halt einfach ne IDE wie MSVC oder DevC++...
aber die sache mit c-files includen würde ich mir an deiner stelle ganz schnell abgewöhnen, sonst wird das zur gewohnheit. und wenn du dann mal was machst was größer als 4 files ist wird es problematisch. zudem sollte man sich an gewisse standards halten.
-
Funktionen deklariert man nicht extern, weil eine Funktionsdeklaration automatisch immer extern ist. Keine AHnung ob extern hier ein Fehler ist oder nicht, aber sicher ist, dass es unnötig und verwirrend ist.
-
Shade Of Mine schrieb:
Funktionen deklariert man nicht extern, weil eine Funktionsdeklaration automatisch immer extern ist.
Keine AHnung ob extern hier ein Fehler ist oder nicht, aber sicher ist, dass es unnötig und verwirrend ist.Ist kein Fehler, es macht auch einen Unterschied, ob das extern da steht oder nicht, insbesondere in Verbindung mit "inline". Vgl: C99, Abschnitt 6.7.4
-
... ich habe fast gar nichts programmiert, sondern in einem vorhandenen Programm, welches großteils automatisch generiert wurde, nach einem Fehler gesucht. Ich habe auch gar nicht die Absicht, Makefiles zu umgehen, es war nur eine Verständnisfrage, normalerweise arbeite ich mehr mit Java. Dennoch vielen Dank für Eure Hilfe.
Gruß,
LukeSkywalker
-
virtual schrieb:
Ist kein Fehler, es macht auch einen Unterschied, ob das extern da steht oder nicht, insbesondere in Verbindung mit "inline". Vgl: C99, Abschnitt 6.7.4
Oha, kannst du das bitte mal kurz zitieren/zusammenfassen?
Bin gerade in der Arbeit und hab da den Standard logischerweise nicht bei der Hand. Wäre super, danke
-
Shade Of Mine schrieb:
virtual schrieb:
Ist kein Fehler, es macht auch einen Unterschied, ob das extern da steht oder nicht, insbesondere in Verbindung mit "inline". Vgl: C99, Abschnitt 6.7.4
Oha, kannst du das bitte mal kurz zitieren/zusammenfassen?
Bin gerade in der Arbeit und hab da den Standard logischerweise nicht bei der Hand. Wäre super, dankeNaja, der Standard ist ja manchmal ein wenig schwer lesbar. Ich beschreib deshalb mal, wie ich es verstanden habe: wenn ich eine inline Funktion habe:
inline void function() { }
Sobald ich nun neben dieser Defintion eine Deklaration mache:
extern void function();
So scheint dies weniger ein Fehler zu sein sondern schlicht dazu zu führen, daß das inline unberücksichtigt bleibt und eine Funktion mit external Linkage erzeugt wird.
Deinen ursprünglichen Einwand, "Funktionen deklariert man nicht extern, weil eine Funktionsdeklaration automatisch immer extern ist." konnte ich jedoch aus einem ganz anderen Grund nicht folgen (bin dann aber über den Standard gestolpert):
static void function();
ist ebenfalls eine Funktionsdeklaration, die jedoch nicht extern ist. Richtig wäre hingegen die Aussage, daß "extern" quasi den Default darstellt, dh wenn man nichts weiter sagt, extern implizit verwendet wird; ich nehme bei nochmaligen Lesen auch an, daß Du das eigentlich zu Ausdruck bringen wolltest. Von daher bezichtige ich mich mal selbst der Erbsenzählerei.