Error "Nicht aufgelöstes Token"



  • Hi!

    Ich bräuchte dringend einmal Hilfe bitte!
    Ich möchte gerne folgenden Header (globale_variablen.h) in zwei cpp-Dateien includieren, da dieser Header wichtige globale Variablen für beide erstellt:

    #pragma once
    #ifndef globale_variablen_H
    #define globale_variablen_H
    
    static int global_baudrate;
    static short global_databits;
    
    enum parityart{none_parity, odd, even, mark, space};
    extern parityart global_parity;
    
    static float global_stopbits;
    
    enum handshakeart{none_hands, rts, rtsxon, xon};
    extern handshakeart global_handshake;
    
    #endif
    

    Aber leider kommt, wenn ich das versuche folgende Fehlermeldung:

    dialog_1.obj : error LNK2020: Nicht aufgelöstes Token (0A00000C) "enum handshakeart global_handshake" (?global_handshake@@$$Q3W4handshakeart@@A).
    dialog_1.obj : error LNK2020: Nicht aufgelöstes Token (0A00000D) "enum parityart global_parity" (?global_parity@@$$Q3W4parityart@@A).
    dialog_1.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""enum handshakeart global_handshake" (?global_handshake@@$$Q3W4handshakeart@@A)".
    dialog_1.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""enum parityart global_parity" (?global_parity@@$$Q3W4parityart@@A)".
    D:\Test\Debug\Test.exe : fatal error LNK1120: 4 nicht aufgelöste externe Verweise.
    

    Ich arbeite mit Visual C++ Express Edition und versuche ne Windows-Forms Anwendung damit zu erstellen.



  • Blöbbör schrieb:

    Ich möchte gerne folgenden Header (globale_variablen.h) in zwei cpp-Dateien includieren, da dieser Header wichtige globale Variablen für beide erstellt:

    Wenn dieser Header die Variablen erstellen würde, hättest Du in jeder der zwei cpp-Dateien jeweils beide Variablen unabhängig (was zu einem Linkerfehler führen würde). Die extern Deklaration erstellt die Variablen jedoch nicht, sie gibt lediglich an, dass es sie (irgendwo in der Linkage) geben wird. Damit sie beim Linken denn dann auch tatsächlich gefunden werden können, musst Du in einem CPP-File eine Definition (die komplette Angabe ohne extern) für die beiden angeben.

    /* the-cpp-file */
    #include "the-h-file"
    parityart global_parity;
    handshakeart global_handshake;
    

    BTW:
    Deine static Variablen global_* werden an dem eingangs geschilderten Problem leiden, dass sie pro cpp-Datei unabhängig sind, will heissen die Änderung von global_baudrate in cpp-Datei 1 wirkt sich nicht auf die global_baudrate in cpp-Datei 2 aus.



  • 1000 Dank für die Erklärung!
    Die enum Variablen funktionieren! Das mit den static Variablen ist mir bis jetzt noch gar nicht aufgefallen, aber das wäre wohl mein nächstes Problem geworden!

    Die static Variablen habe ich jetzt nicht mehr als static, sondern als extern und genauso wie bei den Enums nochmal den Aufruf "int global_..." in einer der beiden cpp-Dateien.

    Ich weiß jetzt nicht so genau, ob ich an dem Visual c++ Konzept irgnedwas falsch verstanden habe, aber gibt es keine simplere Methode um in einer h-Datei globale Variablen zu deklarieren, die von zwei cpp-Dateien benutzt werden und nicht unabhängig von einander sind?!?



  • Hi,
    wenn ich das richtig verstanden habe, soll man unter .net keine globalen Variablen verwenden (korrigiert mich wenn ich falsch liege). Was spricht dagegen Property´s zu verwenden?



  • Was spricht dagegen Property´s zu verwenden?

    Nichts! Bei mir war's nur so, dass ich nen Teil aus nem alten C-Code genommen habe und mir arbeit sparen wollte! Habe es jetzt aber doch alles umgeändert!

    Mein Header sieht jetzt folgendermaßen aus:

    #ifndef globale_variablen_H
    #define globale_variablen_H
    
    public ref class GlobaleVar
    {
      public: static int baudrate;
    		  static short databits;
    		  enum class parityart{none_parity, odd, even, mark, space}parity;
    		  static float stopbits;
    		  enum class handshakeart{none_hands, rts, rtsxon, xon}handshake;
    };
    
    #endif
    

    Aber leider habe ich nun wieder ein kleines Problemchen! Wenn ich nämlich z.B. mit

    GlobaleVar::parity = odd;
    

    auf ein Enum zugreifen will, klappt das nicht. Brauche ich da wieder "extern"? Meine Versuche da was rauszufinden, wie es klappen könnte, sind leider gescheitert.

    Ich bekomme folgende Fehlermeldung:

    error C2597: Ungültiger Verweis auf nicht-statischen Member 'GlobaleVar::parity'
    


  • a) Hast du den Header eingebunden? (#include "globale_variablen.h")

    b) Woher soll er odd kennen? du musst schon GlobaleVar::parityart::odd verwenden.



  • a) Natürlich! 😉

    b) "odd" habe ich doch über das enum erstellt. Und genauso wie ich jetzt z.B. mit GlobaleVar::baudrate = 9600 einen Wert setzen kann, hab ich gedacht, kann ich das mit der per enum definierten Variable auch machen.

    du musst schon GlobaleVar::parityart::odd verwenden.

    Aber "parityart" ist doch nur der Datentyp - oder stehe ich jetzt völlig auf dem Schlauch?! Und "Parity" habe ich als Variable diesen Typs definiert, also muss ich doch auch auf diese Variable irgendwie zugreifen können, oder??



  • Kannst Du ja auch, das Problem ist nur, das der Compiler odd nicht herleiten kann und Du den Typ angeben musst.

    GlobaleVar::parity = GlobaleVar::parityart::odd;
    


  • Achso ok! Jetzt versteh ich's! Und es hat jetzt auch funktioniert, vielen Dank!!!


Anmelden zum Antworten