Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

C++: Globale Variablen über mehrere Dateien

Yves3 / 3 Antworten / Baumansicht Nickles

Hallo

Ist es möglich in der Datei global.h eine Variable zu definieren, die in jeder Datei, die global.h includiert, verwendet werden kann?

In meinem konkreten Fall möchte ich es für einen Zeiger (FILE*) auf eine log Datei (txt) verwenden.
Auf diesen Zeiger werde ich in fast allen Dateien zugreifen um irgendwelche Fehlermeldungen in die Datei reinzuschreiben, es macht also durchaus Sinn, ihn global zu halten.

Leider krieg ich immer enweder Compilerfehler:
d:\\projects\\3dmatrizen\\main.cpp(23) : error C2086: \'g_Protokoll\' : Neudefinition
Fehler beim Ausführen von cl.exe.

oder Linker Fehler (wenn ich mit dem Schlüsselwort extern herumspiele)
Linker-Vorgang läuft...
main.obj : error LNK2005: "struct _iobuf * g_Protokoll" (?g_Protokoll@@3PAU_iobuf@@A) bereits in 3DStuff.obj definiert
Direct3D.obj : error LNK2001: Nichtaufgeloestes externes Symbol "struct _iobuf * Protokoll" (?Protokoll@@3PAU_iobuf@@A)
Debug/3DMatrizen.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Danke schon mal für alle Antworten!

bei Antwort benachrichtigen
Borlander Yves3 „C++: Globale Variablen über mehrere Dateien“
Optionen

Ähm, schon mal darüber nachgedacht das ganze zu kapseln?
Direter Dateizugriff zur Fehlerausgabe und das noch aus verschiedenen Dateien/Klassen heraus scheint mir nicht so ganz glücklich...

bei Antwort benachrichtigen
mr.escape Yves3 „C++: Globale Variablen über mehrere Dateien“
Optionen

Du musst in einer C/CPP datei die variable anlegen, aber ohne den "static" zusatz (damit die variable in anderen dateien gesehen werden kann) und zusätzlich die gleiche deklaration in der header-datei, diesmal aber mit dem zusatz "extern".

z.b. (*.c/*.cpp):
FILE *g_Protokoll;

(*.h):
extern "C" {//kann erforderlich sein, je nach dem, wo die datei verwendet wird
    //hier wohl nicht nötig, oft aber bei funktionen
    extern FILE *g_Protokoll;
}


Ob diese methode in dieser situation die beste lösung ist, bleibt aber zu überlegen.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Yves3 mr.escape „Du musst in einer C/CPP datei die variable anlegen, aber ohne den static zusatz...“
Optionen

Erst mal Danke für die Antworten.
Hatte leider nicht früher Zeit sie mir anzuschauen.

Ihr seit also beide der Meinung, dass das nicht die optimale Lösung wäre...

@Borlander
Das mit dem Kapseln kapier ich nicht ganz, meinst du ich soll eine eigene Klasse in einer eigenen Datei anlegen mit einem einzigen privaten Element(dem Pointer auf die Textdatei) und einer Methode zum reinschreiben?
Das hätte doch keinen Vorteil (so wie ich das sehe nur Nachteile), oder doch?

bei Antwort benachrichtigen