C++ Bedingte Kompilierung

WallaceXIV

PCGH-Community-Veteran(in)
Was genau sagt mir:

#ifndef CKLASSE
#define CKLASSE

...

...


#endif

innerhalb einer Header Datei?
 
In der Header-Datei bewirkt dies, dass der Inhalt zwischen diesen Bereichen nur ein einziges mal verarbeitet wird. Dies verhindert u. a. Mehrfachdefinition, die ansonsten zu Fehlern führen würde.
 
Ok alles klar. Was kommt bei einem C++ Projekt alles in die Headerdatei und was in die .cpp Datei?

Macht es Sinn für alle #include Anweisungen in eine Header zu packen und dann in jede .cpp einzubinden?
 
Normalerweise packt man nur die Implementierung in die Codedateien (meist *.cpp) und Definitionen, etc. in den Header. Ne Vorschrift gibt es dazu aber nicht. Du darfst alles so schreiben wie du möchtest.
 
Also ich hab jetzt die Klassen Definitionen in den Header Dateien und die Methoden dazu in den .cpp Dateien.

Was ist mit den ganzen #includes?
 
Da die Header die in den Includes definierten Inhalte brauchen, müssen sie natürlich in die Header. Wenn du überlegst, merkst du es anhand des untenstehenden Codebeispiels selber. (Die Includes sind hier noch nicht eingefügt. Es fehlen <string> und " foo.hpp".)

Code:
[B]foo.hpp:[/B]
class foo{
public:
    void setString(std::string);
};

[B]foo.cpp:[/B]
void foo::setString(std::string text){
    return;
}

[B]bar.hpp:[/B]
class bar{
public:
    void bar::setFooString();
private:
    foo foo_instance;
};

[B]bar.cpp:[/B]
void bar::setFooString(){
    foo_instance.setString("blah");
}
Eine weitere Idee bei der Aufteilung ist, dass man den Code auch ohne Quellcode der Implementierungen noch kompilieren kann. (Wenn der schon als Objekt kompiliert vorliegt.) Man kann dann foo.o und foo.hpp ausliefern und die Nutzer können das so benutzen. Damit das Linking klappt, müssen die Includes in den Header.
 
Was ist den .hpp ? meine Header Dateien heißen nur .h, macht das einen Unterschied?

Was muss ich in die Main includen? Die Header (.h) oder die .cpp Files?
 
Ob deine Header nun .h, .hpp oder .hxx heißen, ist völlig egal. Wenn du selber ein Makefile schreibst und keine impliziten Definitionen verwenden möchtest, kannst du die Dateien sogar header.deine-mudder-ist-ne-dateiendung nennen. (SCNR Finde es nur immer wieder schön, wenn Leute den Dateinamen ne große Bedeutung beimessen…)

In der Main includierst du natürlich die Header. Alles andere würde bedeuten, dass du auch gleich den ganzen Code in eine Datei schreiben könntest. Mehr mach #include nämlich nicht: Es kopiert den Inhalt der angegebenen Datei (temporär während der Verarbeitung) an der Entsprechenden Stelle in die Ausgangsdatei.
 
Zurück