Deklaration einer globalen Variablen außerhalb einer Klasse
-
Hi,
also hier erst einmal die Kurzgeschichte: (kann Übersprungen werden)
Ich will eine Schnittstelle zu einer API schreiben. Bei mehreren Aufrufen von dieser API übergebe ich einen Zeiger auf eine Callback-Funktion. Ja ja, ich weiß: das alte Thema mit Callback-Funktionen ist schon mehrfach diskutiert worden und ich habe mir auch die FAQ's im WinAPI-Forum durchgelesen. Dort sind mehrere Vorschläge, die entweder in meinem Fall nicht realisierbar sind oder, die ich einfach nicht hinbekomme. Auf jeden Fall wurde dort folgender Vorschlag gemacht:
Eine globale Variable außerhalb der Klasse deklarieren, in der ich einen Zeiger auf die Instanz der Klasse speichere, so daß ich auch auf "nicht-static" members der Klasse zugreifen kann und das außerhalb der static Callback-Funktion. Das wäre für meinen Fall in Ordnung, da es sowieso nur eine Instanz der Klasse geben soll...------------------------------------------
Ab hier die eigentlich Frage:
Wie deklariere ich nun eine globale Variable außerhalb der Klasse. Wenn ich das nämlich tue, erhalte ich folgende Fehlermeldung:multiple definition of `__Ptr'
first defined here
....Das ist bestimmt total einfach, aber ich komme tatsächlich nicht drauf. Ist also wirklich ernst gemeint...
-
Wie kann man so doof sein:
Wer hier die Deklaration nicht in der Header-Datei macht ist echt im Vorteil. Und dann klappt es auf einmal auch mit dem Nachbarn...Sorry, für den Space, den ich Anspruch genommen habe.
-
auch
#ifndef und #endif
können nützlich sein
-
BorlandUser schrieb:
Wer hier die Deklaration nicht in der Header-Datei macht ist echt im Vorteil. Und dann klappt es auf einmal auch mit dem Nachbarn...
Ich packe die Variablendeklarationen immer in den Header (zumindest bei globalen Variablen)
@nirsaja:
Ja, nützlich sind sie schon - aber wie könnte man damit das Problem lösen?
-
Naja gerade wenn er die globalen Variablen in sein Haeder packt sind #ifndef/#endif nützlich, denn sobald er den Haeder zweimal includiert(Was ja das vorteilhafte an Haedern ist), gbit's eine Mehrfachdeklaration.
-
nirsaja schrieb:
Naja gerade wenn er die globalen Variablen in sein Haeder packt sind #ifndef/#endif nützlich, denn sobald er den Haeder zweimal includiert(Was ja das vorteilhafte an Haedern ist), gbit's eine Mehrfachdeklaration.
Ist mir noch nicht aufgefallen...
PS:
folgendes ist legal:extern int i; extern int i; extern int i; extern int i; extern int i; extern int i;
-
Shade Of Mine schrieb:
PS:
folgendes ist legal:extern int i; extern int i; extern int i; extern int i; extern int i; extern int i;
Ja sicher, aber wieso denn jetzt plötzlich extern???
Es ging doch um globale Variabeln und wenn er die im Haeder deklariert und mehrfach includiert, umgeht er doch gerade extern.
-
nirsaja schrieb:
Ja sicher, aber wieso denn jetzt plötzlich extern???
Es ging doch um globale Variabeln und wenn er die im Haeder deklariert und mehrfach includiert, umgeht er doch gerade extern.Ja - ich hab doch ne Deklaration von i gepostet.
Eine Variable deklariert man halt mit extern - sonst wäre es ja ne Definition...siehe FAQ: http://www.c-plusplus.net/forum/viewtopic.php?t=61231
-
Hmm... und
int i;
ist keine Deklaration?
Naja das ist wiederum mir noch nie aufgefallen..
-
nirsaja schrieb:
Hmm... und
int i;
ist keine Deklaration?
Naja das ist wiederum mir noch nie aufgefallen..
Jein. Es ist eine Definition. Und jede Definition ist natürlich irgendwie auch eine Deklaration - bzw. beinhaltet einige merkmale einer Deklaration.
Deklaration sagt: Es gibt irgendwo eine Variable i des Typs int
Definition sagt: Hier ist die Variable i vom Typ intDas bedeutet, dass eine Definition natürlich auch eine Bekanntmachung ist
Aber im Prinzip ist die Bezeichnung von
int i;
als Deklaration ein Fehler.
-
naja... ich geh mal davon aus, dass du mehr Ahnung als ich hast und glaube dir. Mein Compiler sagt jedenfalls bei
int i; int i;
[C++ Error] Unit1.cpp(1): E2238 Multiple [b]declaration[/b] for 'i' [C++ Error] Unit1.cpp(2): E2344 Earlier [b]declaration[/b] of 'i'
Aber sind wir doch mal ehrlich... eigentlich ist dass hier gerade ziemlich off topic. BorlandUser hat sich ja offensichtlich schon selbst geholfen!
-
Finde ich interessant.
Ist das der Borland C++ Compiler? Welche Version?
Also mein gcc (3.3.2) sagt:
error: redefinition of `int i'Und comeau online sagt
error: variable "i" has already been definedIch würde sagen, dass dein Compiler da etwas ungenau ist. Denn ich sehe keine 'Redeklaration' nur eine 'Redefinition'.
Klar sind wir OffTopic - aber ich finde sowas interessant. Und man kann ne Menge bei sowas lernen...
-
Shade Of Mine schrieb:
Klar sind wir OffTopic - aber ich finde sowas interessant. Und man kann ne Menge bei sowas lernen...
Jup...
Ich benutze den Borland C++ Builder 6.0 Enterprise.
bei
extern int i; extern int i; extern int i;
hat er keine Einwände, was aber auch verständlich ist.
-
Eine Redeklaration kann doch auch nicht fehlerhaft sein, oder?
Wenn zwei mal gesagt wird, dass irgendwo i existiert, ist das ja kein Problem, anders, wenn man sagt:
Hier ist i.Dann kann es zu Problemen kommen...
-
Mis2com schrieb:
Eine Redeklaration kann doch auch nicht fehlerhaft sein, oder?
genau das habe ich ja gesagt
-
Meinen wir das nicht alle?
nirsaja schrieb:
keine Einwände, was aber auch verständlich ist.