ständige multiple defition


  • Mod

    Du bist witzig. Ob dein mutex wohl einmal in jeder Übersetzungseinheit vorkommt, in der shared.h eingebunden wird? Wie soll das ifndef denn da greifen?



  • @definition
    Headerguards wirkien sich lediglich auf die gleiche Übersetzungseinheit (.cpp) aus. Und in dem ersten Header hast du eine Definition, welche so von mehreren .cpp's implementiert wird und daher hast du eine Mehrfachdefinition.

    Und anstatt jetzt in die ewige Singleton/extern Diskussion zu kommen erstell den Mutex lieber in der main und übergib ihn dann dem Thread. Das ist dann auch gerade viel flexibler.



  • SeppJ schrieb:

    Du bist witzig. Ob dein mutex wohl einmal in jeder Übersetzungseinheit vorkommt, in der shared.h eingebunden wird? Wie soll das ifndef denn da greifen?

    Stimmt, jetzt seh ichs auch 😃
    Ganz übersehen vor lauter Suche nach der Fehlermeldung, die ja jetzt doch nicht mal nötig gewesen wäre 🙄

    Lg freeG



  • definition schrieb:

    Es wird mir ständig von meiner IDE zurück gegeben, dass ein Objekt bereits defintiert sein soll.

    Sharing.h

    #ifndef SHARING_H
    #define SHARING_H
    
    #include <QMutex>
    
    extern QMutex mutex;
    
    #endif // SHARING_H
    

    Sharing.cpp

    //...
    QMutex mutex;
    //...
    

    Unabhängig davon das ich absolut kein Fan von globalen Variablen bin.



  • Könnt ihr mir kurz den Fix erklären? 🙂
    Es funktioniert nun, danke 😉
    Jetzt muss ich nur noch das mit dem Mutex hinkriegen, aber das ist ja ein anderes Thema.



  • definition schrieb:

    Könnt ihr mir kurz den Fix erklären? 🙂

    Das ist ein Anfängerfehler. Das wurde hier bestimmt schon zig mal durchgekaut. Ein paar Stichwörter für Deine Recherche:

    linkage (Bindung)
    translation unit (Übersetzungseinheit)
    one definition rule
    separate compilation (getrennte Übersetzung)

    Versuche auch rauszubekommen, was genau "Deklaration" und "Definition" bedeutet. In der C++ Welt haben diese zwei Wörter eine feststehende Bedeutung, die man kennen sollte.



  • krümelkacker schrieb:

    Das ist ein Anfängerfehler.

    Ist vor allem ein Fehler, bei dem es C++ dem Programmierer schwerer, als nötig macht. Das ist halt das Problem mit den historisch gewachsenen Strukturen von C++.



  • ProgChild schrieb:

    Ist vor allem ein Fehler, bei dem es C++ dem Programmierer schwerer, als nötig macht. Das ist halt das Problem mit den historisch gewachsenen Strukturen von C++.

    Trotzdem sollte man sich vielleicht mit dem Konzept der Übersetzungseinheiten und der ODR befassen. Das ist zentral in C++, auch wenn es ursprünglich von C kommt.

    Darüber hinaus muss man bei globalen Variablen sowieso überlegen, ob es nicht eine bessere Möglichkeit gibt.



  • Nexus schrieb:

    Trotzdem sollte man sich vielleicht mit dem Konzept der Übersetzungseinheiten und der ODR befassen. Das ist zentral in C++, auch wenn es ursprünglich von C kommt.

    Warum trotzdem? Natürlich muss man das wissen, wenn man C++ beherrschen will. Nur braucht man sich nicht blöd vorkommen, wenn man dieses Verhalten nicht sofort versteht. IMHO



  • ProgChild schrieb:

    Warum trotzdem?

    Naja, weil ich es für eine schlechte Entschuldigung halte, zu sagen: "Das ist ein historisches C++-Problem", nur weil man sich nicht damit befasst hat. Aber es ist natürlich wie du sagst ein Grund, warum man unter Umständen etwas länger braucht und sich ausführlicher mit dem Thema auseinandersetzen muss.


Anmelden zum Antworten