# C++ Bedingte Kompilierung



## WallaceXIV (22. Mai 2011)

Was genau sagt mir:

#ifndef CKLASSE
#define CKLASSE

...

...


#endif

innerhalb einer Header Datei?


----------



## bingo88 (22. Mai 2011)

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.


----------



## WallaceXIV (22. Mai 2011)

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?


----------



## Bauer87 (22. Mai 2011)

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.


----------



## WallaceXIV (22. Mai 2011)

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?


----------



## Bauer87 (22. Mai 2011)

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".)


```
[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.


----------



## WallaceXIV (25. Mai 2011)

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?


----------



## Bauer87 (25. Mai 2011)

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.


----------

