Globale Variable
-
Die globalen Variablen müssen in eine Header-Datei, den du dann überall über #include einfügst.

-
Kann ich nachvollziehen. Nur: erst mal was ich will.
Ich lese aus der Registry einige Werte ein. Die sollen überall verfügbar und veränderbar sein ohne wieder auf die Registry zuzugreifen. Wollte noch was anderes schreiben, aber Du hast mich auf eine Idee gebracht, wie das funktioniert. Muß ausprobieren und werde mich melden.
Vielen Dank erstmal
Robert
-
don_basto schrieb:
Die globalen Variablen müssen in eine Header-Datei, den du dann überall über #include einfügst.

Das sollte aber einen Linker-Error (multiple definition of...) geben.
Eine korrekte Lösung ist z. B., die globalen Variablen in einem Modul einmal zu definieren und dann nochmal in einem Header mit extern zu deklarieren. Diesen Header bindest du nun in allen anderen Modulen ein, wo du die globalen Variablen benutzen willst.
Beispiel:
Du hast die Module foo.cpp, bar.cpp und main.cpp und willst in allen die Variable my_global_var benutzen.
Dann kannst du (z.B.) folgendes machen:// header.hpp - hier extern-Deklaration der Variablen. extern int my_global_var; // foo.cpp #include "header.hpp" // hier kannst du jetzt my_global_var benutzen. // bar.cpp #include "header.hpp" // dito. // main.cpp int my_global_var; // Definition. // hier in main kannst du my_global_var ebenfalls benutzen. int main() { ... }In obigem Beispiel definierst du die Variable my_global_var in main.cpp (D.h. hier stellst du auch Speicher für diese Variable bereit). In foo.cpp und bar.cpp bindest du nur den Header ein, in dem die Deklaration
extern int my_global_var;steht, die besagt, dass es in irgendeinem modul (in unserem Beispiel ist das main.cpp) bereits einen Bezeichner gleichen Namens (in unserem Beispiel my_global_var) gibt, für den auch bereits Speicher reserviert wurde und dass sich jeder Zugriff auf den Bezeichner aus diesem Modul (foo.cpp oder bar.cpp) doch bitte auf den Bezeichner (und den dort reservierten Speicher) in main.cpp beziehen soll.
Gruß Caipi
-
Robertico schrieb:
Cpt.Tanga schrieb:
Was soll das bedeuten? Hast du noch nie versucht von mehreren eine Antwort zu kriegen?
...nein. erstmal ne weile in einem forum auf eine antwort warten vielleicht...
extern koennte helfen.
auch das hier koennte helfen...http://bcb-tutorial.c-plusplus.net/registry/index.html
-
@Caipi:
Bei mir hat's bisher immer gefunzt. Allerdings hab ich globale Variablen bisher nur für Enums und Konstanten genutzt.
Den Rest soll man ja kapseln.
-
Danke, das war sehr gut erklärt. Ich danke Dir für diese qualifizierte Antwort. Sie hilft mir das System zu verstehen. Ich kann zwar schon gut "sprechen" nur muß ich die "Sprache" C++ noch lernen. Im Momment spreche ich zwar noch wie ein Ausländer, aber das wird sich geben. Und wenn es solch gute Leute gibt wie dich, die etwas von ihrem Wissen abgeben, wird das auch nicht so lange dauern.
Vielen Dank
Robert
-
Cpt.Tanga schrieb:
Robertico schrieb:
Cpt.Tanga schrieb:
Was soll das bedeuten? Hast du noch nie versucht von mehreren eine Antwort zu kriegen?
...nein. erstmal ne weile in einem forum auf eine antwort warten vielleicht...
extern koennte helfen.
auch das hier koennte helfen...http://bcb-tutorial.c-plusplus.net/registry/index.htmlSiehst du, hier habe ich die Antwort bekommen. Hätte ich jetzt gewartet wie ein braver Tropf, wäre mir diese Antwort vielleicht nie zu gesicht gekommen.
Ich finde es nicht verwerflich in mehreren Foren die gleiche Frage zu stellen. Und auch Zeitgleich. Hat man nämlich eine Frage, so brennt die meistens. Man will es jetzt wissen und nicht in einer Woche. So sind die Menschen halt.
Auf meiner Suche nach irgendwas halte ich auch an, wenn irgendjemand etwas nicht weis, was ich weis. Und ich bemühe mich es ihm verständlich zu machen.
Dazu denke ich gibt es die Foren.
Gruß Robert
-
don_basto schrieb:
@Caipi:
Bei mir hat's bisher immer gefunzt. Allerdings hab ich globale Variablen bisher nur für Enums und Konstanten genutzt.
Den Rest soll man ja kapseln.
Wenn du ein enum wie folgt im File-Scope einer Datei definierst:
enum my_special_enum { special_value1, special_value2 };kannst du nicht davon sprechen, dass hier eine globale Variable oder ein globales Objekt angelegt wurde. Hier erzeugst du nichts physisches sondern vielmehr einen abstrakten "Bauplan" nach welchem Objekte dieses Typs erzeugt werden.
Dein Argument mit den Konstanten verstehe ich nicht ganz. Zeig doch mal einen entsprechenden Code :).Gruß Caipi
-
(Später berichtigt, hatte doch schon geantwortet. Doppelt genäht hält besser)
Habe gerade mit Erschrecken festgstellt, daß ich noch nicht geantwortet habe. Im Kopf hatte ich das schon, aber mit Telepatie :p sind wir ja noch nicht so weit.Auf jeden Fall möchte ich mich dafür bedanken, daß es solche Menschen gibt wie Dich. Ich stoße oft auf Missverständnis. Ich solle doch mit Konsolenprogrammen machen. Vielleicht haben die Leute recht. Ich weiß micht. Nur habe ich schon so viel im Kopf, das muß nur erweitert werden.
Ich hab Konsolenprogramme gemacht. Klar. Hab auch überall unten angefangen. Nur kann ich besser beim Problemelösen lernen.
Und dabei hast Du mir geholfen. Auch so kann man einen Zsammenhang verstehen.
Vielen vielen Dank
Robert
-
Robertico schrieb:
Habe gerade mit Erschrecken festgstellt, daß ich noch nicht geantwortet habe. Im Kopf hatte ich das schon, aber mit Telepatie :p sind wir ja noch nicht so weit.
Auf jeden Fall möchte ich mich dafür bedanken, daß es solche Menschen gibt wie Dich. Ich stoße oft auf Missverständnis. Ich solle doch mit Konsolenprogrammen machen. Vielleicht haben die Leute recht. Ich weiß micht. Nur habe ich schon so viel im Kopf, das muß nur erweitert werden.
Ich hab Konsolenprogramme gemacht. Klar. Hab auch überall unten angefangen. Nur kann ich besser beim Problemelösen lernen.
Und dabei hast Du mir geholfen. Auch so kann man einen Zsammenhang verstehen.
Vielen vielen Dank
Robert
Was ist los? Ich werd ja ganz nervös ;). So toll war meine Hilfe nun auch wieder nicht und außerdem hast du dich doch schon einmal um ~23:38 bedankt. (Ist wohl doch noch etwas früh, oder ;)).
Btw: Mein letzter obiger Post bezog sich auf don_basto.
Gruß Caipi
-
Hab schon berichtigt. Bin wohl etwas in die Bohnen
~23:38:37Gruß Robert
-
@Caipi:
Hier mal ein bisschen Kode, nicht getestet aber anolog dem verwendeten:#ifndef __GLOBAL_H__ #define __GLOBAL_H__ namespace test { enum testEnum { TEST_NULL = 0, TEST_START = 10, TEST_DRAW, TEST_END, TEST_ERROR = 20 }; const char* const TEST_FILE = "test.ini"; } #endif __GLOBAL_H__Was ich nicht ganz verstehe:
Warum sollte es denn mehrfache Definitionen geben, wenn man include-Wächter nutzt?
Warum ist eine Filescope-Variable nicht global, wenn man die Datei in alle anderen Header mit einbindet?Grüsse,
don_basto
-
Include-Wächter helfen nur zu verhindern, daß du den selben Code mehrfach in eine Objektdatei einbindest (wenn du z.B. drei Header in deiner main.cpp nutzt, die alle den selben "helper.h" einbinden, würden dessen Definitionen dreifach auftauchen). Doppelte globale Variablen machen erst Probleme, wenn du mehrere (unabhängig voneinander compilierte) Objektdateien zu einer EXE linken willst - an der Stelle nützen die Include-Wächter gar nicht.