C++ #ifdef Problem

mausweazle

Lt. Commander
Registriert
Mai 2008
Beiträge
1.633
hallihallo liebe community,
ich hab n kleines Problem mit #ifdef .. #endif Direktiven.

Es geht darum, dass ich ne Klasse TV in ner .h Datei gespeichert habe. Und falls diese .h Datei nicht included wird, soll die Klasse TV in der source Datei nochmal neu erstellt werden.

Erstmal die .h Datei:

#include <iostream>
#define Homofrst
class TV
{
public:
void setStation(int station);
int getStation();
TV();
TV(int station);

private:
int station;
};

Jetzt die Source Datei:

#include <iostream>
#include <C:\Studium\C++ Programme\Blatt 8\tv.h>

#ifdef Homofrst
cout << "definiert homofrst" << endl;
#else
#define Homofrst
class TV
{
public:
void setStation(int station);
int getStation();
TV();
TV(int station);

private:
int station;
};
#endif

//jetzt geht weiter mit dem normalen Source-code
blablabla


Die Fehlermeldung die jetzt kommt ist folgende:
C:\Studium\C++ Programme\Blatt 8\tv.cpp|9|error: redefinition of `class TV'|
C:\Studium\C++ Programme\Blatt 8\tv.h|4|error: previous definition of `class TV'|
||=== Build finished: 2 errors, 0 warnings ===|

Ich gehs mal von oben durch. Jetzt wird ja erst tv.h included und Homofrst definiert. Dann gehts in der Source-Datei mit der Abfrage, ob Homofrst schon definiert ist weiter. Es ist definiert also soll ausgegeben werden: "definiert homofrst"... Falls es noch nicht definiert war, wird jetzt die Klasse TV geschrieben.
Ich verstehe also nicht, warum der compiler meckert, dass class TV neudefiniert wird.


Bitte um Hilfe
Bin noch C++ Anfänger

Mausweazle

PS: warum rückt der den Quellcode nicht ein? Habs eingerückt reinkopiert und es wird auch im "Beitrag-Ändern"-Modus richtig angezeigt, aber im fertigen Beitrag nicht mehr...
 
Benutze bitte Code-Tags:


Header:

Code:
#include <iostream>
#ifndef Homofrst
#define Homofrst
class TV
{
public:
void setStation(int station);
int getStation();
TV();
TV(int station);

private:
int station;
};
#endif

Source:

Code:
#include <iostream>
#include "header.h"




#ifndef Homofrst
class TV
{
public:
void setStation(int station);
int getStation();
TV();
TV(int station);

private:
int station;
};

#endif

Das sollte funktionieren. Genau herauszufinden, wo dein Fehler lag, überlasse ich erstmal dir ;)


Gruß,

badday
 
Mal ne Frage, für was wäre sowas sinnvoll?

für

Code:
#else
#include "tv.h"
#endif

hätte ich ja noch verständnis
 
Zuletzt bearbeitet:
Mal ne Frage, für was wäre sowas sinnvoll?
Und falls diese .h Datei nicht included wird, soll die Klasse TV in der source Datei nochmal neu erstellt werden.
Offenbar hat der TE gedacht, das wäre sinnvoll, nur: Wenn die Headerdatei nicht geöffnet werden kann, wird das ohnehin nicht kompilieren. Man könnte das natürlich ggf. testen, allerdings: Warum dann überhaupt eine Headerdatei?
 
Es widerspricht doch komplett dem Ansatz mit Klassen eine Klasse nochmal neu zu schreiben. Die Aufgabenstellung ist einfach sinnlos (in meinen Augen). Wenn ich nun nicht wüsste ob die Klasse eingebunden ist könnte ich sie ja dann einbinden, aber doch nicht neu schreiben. Oder hab ich da nen Denkfehler?

Und was sit das eig fürn Compiler? gcc?
 
Das ging nur darum ein Beispiel zu machen. Wollte verstehen wie das funktioniert. Das hatte keinen tieferen Sinn sondern war nur zu meinem Verständnis da.
Die Aufgabenstellung war ja nicht die, dass ich die Klasse TV nochmal neu schreiben, sondern eher zu verstehen wie #ifdef #endif und #define funktioniert.
 
#ifdef etc sind alles präprozessordirektiven, die der compiler nicht merh zu sehen bekommmt. normale compilerbefehle darfst du da nicht hinschreiben, die ham da nix verloren.

header dateien die aus std lib kommen gehören in <>, deine eigenen in ""
 
pizza4ever
was meinst du mit "normalen" compilerbefehlen?
also ne Klassendefinition? oder wie?


Wenn ich header-dateien mit "" einbinde, dann schaut der präprozessor unter anderem ja im aktuellen verzeichnis nach. Wenn ich es aber so mache wie oben, dann schaut er genau in diesem verzeichnis nach. richtig?
 
mausweazle schrieb:
Wenn ich header-dateien mit "" einbinde, dann schaut der präprozessor unter anderem ja im aktuellen verzeichnis nach. Wenn ich es aber so mache wie oben, dann schaut er genau in diesem verzeichnis nach. richtig?

Das ist leider implementierungsspezifisch. Soll heißen, was der Präprozessor bei #include <file.h> oder #include "file.h" tut, hängt vom jeweiligen Compiler ab. Der C++ Standard äußert sich hierzu leider nicht.

Der Standard schreibt allerdings schon vor, daß Standardheader mit #include <header> einzuziehen sind.


Hier noch der relevante Auszug aus dem Standard, damit ihr mir das auch glaubt. ;)

16.2 Source file inclusion


  1. A #include directive shall identify a header or source file that can be processed by the implementation.

  2. A preprocessing directive of the form
    # include <h-char-sequence> new-line
    searches a sequence of implementation-defined places for a header identified uniquely by the specified
    sequence between the < and > delimiters, and causes the replacement of that directive by the entire contents
    of the header. How the places are specified or the header identified is implementation-defined.

  3. A preprocessing directive of the form
    # include "q-char-sequence" new-line
    causes the replacement of that directive by the entire contents of the source file identified by the specified
    sequence between the " delimiters. The named source file is searched for in an implementation-defined
    manner.
    If this search is not supported, or if the search fails, the directive is reprocessed as if it read
    # include <h-char-sequence> new-line
    with the identical contained sequence (including > characters, if any) from the original directive.
 
Zuletzt bearbeitet:
Ja okay das hab ich verstanden.
es ist also nicht standard, in welchen verzeichnissen geschaut wird. das hängt vom jeweiligen compiler ab. okay.
bei standard-headern soll man #include <headername> nehmen und bei meinen eigenen headern #include "headername".
 
Zurück
Oben