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 int

    Das 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 defined

    Ich 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.


Anmelden zum Antworten