PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Header und Sources


Marscel
2005-08-14, 00:27:51
Allen Code in eine CPP-Datei zu schreiben ist ja machbar, aber irgendwie Käse, was die Übersicht angeht, finde ich.

Wenn ich mir irgendwelche C++ Quellcodes aus dem Internet ansehe, dann gibts da eine *.cpp und eine *.h Datei mit demselben Namen.

Der Sinn, der dahinter steckt, ist mir ein wenig klarer als die Anwendung des ganzen. Traditionell ist es doch so, dass in den Header-Dateien die Prototypen der Funktionen und Elementfunktionen und in den gleichnamigen Sourcedateien die Deklarationen stehen, richtig?

Angenommen, alle Dateien gehören zu einem Projekt (bei mir Dev-Cpp), die cpp-Datei, in der die main() Funktion steht, muss doch alle Headerdateien beinhalten (#include "xyz.h") ? Aber wie siehts mit den gleichnamigen *.cpp Dateien aus, wie werden die mitreingenommen (entweder habe ich falsch gesucht, oder es geht anders)?

Wenn ich dem Projekt einfach eine Source-Datei hinzufüge und irgendwelchen Code schreibe, egal ob Deklaration oder Inline, tut sich nichts, notfalls meckert der Debugger.

Ich hab z.B. eine abstrakte Klasse, die in einem Header "abstract.h" stehen soll, eine Klasse SubAbstract, die die abstrakte Klasse erbt und welche in "subabstract.h" stehen soll, die Deklaration der Elementfunktionen kommt dann in "subabstract.cpp" und irgendwo ist dann auch die "main.cpp".

Kann mir bitte jemand das Prinzip mal durchleuchten oder nen Link zu einer Erklärung geben?

Coda
2005-08-14, 00:34:33
Also ich hab jetzt nicht ganz genau verstanden was dein Problem ist, aber ich vermute dass du keine Header-Guards gesetzt hast.

Man verwendet normalerweise in Headern dieses Grundgerüst:

#ifndef EXAMPLE_HEADER_H
#define EXAMPLE_HEADER_H

// ... Header Code ...

#endifWobei hier EXAMPLE_HEADER_H für eine eindeutige Definition pro Header steht.

Durch das wird vermieden, dass der Header in der gleichen Übersetzungseinheit zweimal eingefügt wird, was ja zwangsläufig zu Problemem führen würde.

Falls das nicht das Problem ist, kannst du vielleicht versuchen dein Problem etwas anschaulicher darzustellen? ;)

Neomi
2005-08-14, 00:43:19
Eine grobe (und leicht vereinfachte) Erklärung...

Der Compiler arbeitet alle Sourcedateien eines Projektes einzeln ab. Er muß nicht zwingend wissen, wie eine aufgerufene Funktion implementiert (Definition) ist, er muß nur die korrekte Art ihres Aufrufs kennen. Deshalb reicht die "Bekanntmachung" (Deklaration) in einer eingebundenen Headerdatei. Die kompilierten Dateien, die er ausspuckt, sind auch nicht wirklich ausführbar, es gibt meist noch sehr viele Platzhalter für Funktionsaufrufe und Variablen aus anderen Sourcen.

Aus den kompilierten Dateien wird das ausführbare Programm dann vom Linker zusammengesetzt. Der löst die Platzhalterverweise auf, wirft je nach Einstellung unreferenzierte Sachen raus. Der Linker ist es auch, der meckert, wenn zu einer deklarierten Funktion keine Definition gefunden wird.

Was meinst du mit "meckert der Debugger"?

Marscel
2005-08-14, 13:56:16
Falls das nicht das Problem ist, kannst du vielleicht versuchen dein Problem etwas anschaulicher darzustellen? ;)

Das Problem hab ich allein in den Griff bekommen, danke. ;)

Neomi's Beschreibung hat mir weitergeholfen, ich hatte eine Sache übersehen.

Ich meine eigentlich folgendes:

Datei "main.cpp":
#include <iostream>
#include "print.h"

using namespace std;
int main()
{
printHallo();
return 0;
}

print.h:
void printHallo();

print.cpp:
#include <iostream>

using namespace std;

void printHallo()
{
cout << "Hallo" << endl;
}

Mir war nicht ganz klar, dass der Compiler jede Source-Datei einzeln durchgeht, ich dachte erst, jede Source-Datei müsse wie ein #include behandelt werden.

Mit "meckern" meinte ich, dass der Debugger hin und wieder meinte "undeclared function" etc., aber das hat sich erledigt.

Gast
2005-08-14, 14:12:43
Das Problem hab ich allein in den Griff bekommen, danke. ;)

Neomi's Beschreibung hat mir weitergeholfen, ich hatte eine Sache übersehen.

Ich meine eigentlich folgendes:

[...]

Mir war nicht ganz klar, dass der Compiler jede Source-Datei einzeln durchgeht, ich dachte erst, jede Source-Datei müsse wie ein #include behandelt werden.

Mit "meckern" meinte ich, dass der Debugger hin und wieder meinte "undeclared function" etc., aber das hat sich erledigt.

Wenn du bei IDEs wie dem Devcpp eine Source Datei zum Projekt hinzufügst wird diese auch automatisch ins Makefile übernommen. Das Makefile sagt dem Compiler im Prinzip aus welchen Dateien (*.cpp, die *.h fügst du ja selber mit #include ein) dein Projekt besteht und wie sie voneinander abhängen.
Dieses hinzufügen passiert im Hintergrund, davon bekommst du nichts mit. Wenn du also eine c++ datei aus dem internet in deinem Projekt verwenden willst reicht es nicht sie einfach im Devcpp zu öffnen, du musst die Datei erst zu deinem Projekt hinzufügen weil sie erst dann im Makefile steht.


Aber wie siehts mit den gleichnamigen *.cpp Dateien aus, wie werden die mitreingenommen (entweder habe ich falsch gesucht, oder es geht anders)?
Ich nehme an das hast du mit dieser frage wissen wollen

Neomi
2005-08-14, 15:04:00
Mit "meckern" meinte ich, dass der Debugger hin und wieder meinte "undeclared function" etc., aber das hat sich erledigt.

Da wirfst du ein wenig durcheinander. Über nicht deklarierte Funktionen meckert der Compiler, über nicht definierte Funktionen der Linker. Der Debugger kann erst bei einem erfolgreich gelinkten Programm (Voraussetzung für den Linker sind erfolgreich kompilierte Sourcen) zur Laufzeit aktiv werden. Was der dann anmeckern kann, sind uninitialisiert benutzte Variablen, Speicherzugriffsverletzungen und ähnliches.

Marscel
2005-08-14, 16:26:54
Ich meinte eigentlich den Compiler, danke für die Korrektur. :)

pippo
2009-02-10, 16:29:31
Ich habe grad das gleiche Problem: Einen Code mit 1000 Zeilen und hab ihn in 3 .cpp aufgeteilt. Funktioniert auch alles prima soweit. Ich hab die Prototypen in die gleichnamigen Header gepackt und die Funktionen selbst auf 2 .cpp aufgeteilt. Ist das richtig so?

Doch was mach ich z.B. mit einem #define ? Extra nochmal ne Header oder wie löst man das sauber?

instinct
2009-02-10, 19:07:29
Wenn man es sauber macht, schreibt man keine 1000Zeilen in eine Datei und splittet die dann ;)

Man sollte sich zuerst über die Teile klar werden, die Schnittstelle in der jeweiligen Header-Datei festlegen und dann implementieren.

pippo
2009-02-10, 19:16:40
Achne :)

Wir haben sowas halt nie gelernt, aber so langsam sollt ich an sowas doch mal denken :) Also wie is das jetzt mit den defines?

instinct
2009-02-10, 19:36:35
Was genau meinste mit #define?
Meinst du damit irgendwelche Konstanten? Wenn ja dann sollten die in die header/source datei in der du diese verwendest.
Meinst du die Header-Definition, wie Coda sie beschrieben hat, gehören sie in die Header-Datei.

pippo
2009-02-10, 19:50:22
Im mein Konstanten, aber die brauch ich in mehreren .cpp

Coda
2009-02-10, 21:43:40
Dann pack sie zwischen die Header Guards.

pest
2009-02-10, 23:16:29
Im mein Konstanten, aber die brauch ich in mehreren .cpp

für soetwas bietet sich eine "global.h" an in der du alle wichtigen dinge schreibst die du mal gebrauchen könntest, die brauch keine implementierung