Zu doof für #pragma once



  • Hallo Leute, wie es scheint bin ich zu doof #pragma once einzusetzen bzw zu verstehen 😕

    main.cpp

    #include fisch.h
    ...
    

    fisch.cpp

    #include fisch.h
    ...
    gewicht = 123;
    ...
    

    fisch.h

    #pragma once
    int gewicht;
    

    Ich dachte dass #pragma once dafür Sorge trägt, dass fisch.h nur ein einziges Mal eingeladen wird. Wieso kommt dann aber beim linken eine LNK2005 Fehlermeldung wegen eines bereits vorhandenen "gewicht" in main?

    Meine Vermutung: habe etwas Grundsätzliches nicht verstanden hehe.

    Würde mich über Aufklärung freuen, tschüsss 😋



  • mikeem schrieb:

    Meine Vermutung: habe etwas Grundsätzliches nicht verstanden hehe.

    So ist es. Pragma once (oder Include-Guards) schützt dich nur davor, dass eine Headerdatei mehr als einmal in eine cpp-Datei eingebunden wird.

    Es schützt dich nicht davor, dass eine Headerdatei in mehrere cpp-Dateien eingebunden wird. Das soll es auch nicht, denn das ist ja erwünscht.

    Du darfst einfach in Headerdateien keine Variablen definieren, sondern nur deklarieren, mit extern. Definieren (und initialisieren) musst du sie dann in einer cpp-Datei.



  • MFK schrieb:

    Du darfst einfach in Headerdateien keine Variablen definieren, sondern nur deklarieren, mit extern.

    Und extern sollte man doch auch eher vermeiden, oder? Abgesehen davon, dass Globale direkt aus der Hölle kommen, bindest du zusätzlich den Header damit an die cpp-Datei, die die Globale definiert (ist oft egal, ich weiß).

    @mikeem:
    Wieso eine Globale? Dein Header heißt fisch.h. Das scheint doch prädestiniert für eine Klasse Fisch mit Member Gewicht! 💡



  • Hallo ihr zwei beiden.

    Aha ich wusste doch, dass ich nichts wusste. Dankeschön für die Infos!

    P.S. matze, das Fisch-Klasse Beispiel habe ich nur erfunden, um das Problem zu verdeutlichen. Aber im übrigen bin ich ein Freund von globalen Variablen 😃



  • mikeem schrieb:

    Aber im übrigen bin ich ein Freund von globalen Variablen 😃

    ⚠ Global Variables Are Bad ⚠



  • Roger Wilco schrieb:

    ⚠ Global Variables Are Bad ⚠

    Och ich sehe das nicht so dogmatisch. Bei meinen kleinen Freizeitprojekten sind globale Variablen viel übersichtlicher. Eine Zeile *zack* fertig. Ist ja auch nicht so, dass das halbe Programm daraus bestünde 😉
    Aber ich stimmte dir zu, wer ein Großprojekt angeht, muss sich mit sowas auseinandersetzen!



  • mikeem schrieb:

    Roger Wilco schrieb:

    ⚠ Global Variables Are Bad ⚠

    Och ich sehe das nicht so dogmatisch. Bei meinen kleinen Freizeitprojekten sind globale Variablen viel übersichtlicher. Eine Zeile *zack* fertig. Ist ja auch nicht so, dass das halbe Programm daraus bestünde 😉
    Aber ich stimmte dir zu, wer ein Großprojekt angeht, muss sich mit sowas auseinandersetzen!

    Auch bei kleinen Projekten sollte man aus guten Gründen (meist) auf Globale verzichten. Vielleicht ist es bei einem 50-Zeilen-Progrämmchen egal, aber da du offensichtlich schon deine Programme auf mehrere Übersetzungseinheiten aufteilst, sprengst du die 50-Zeilen-Grenze sicher locker. 😉



  • Auch bei kleinen Sachen sollte man es lassen, weil man sich einfach gewisse Dinge dann angewöhnt und später automatisch so macht.

    Das ist wie bei den Code-Beispielen, die viel unsauberen Code beinhalten, weil es ja nur ein Beispiel sein soll. Damit rennen dann aber viele Anfänger gegen die Wand, weil die sich das abgucken.



  • Roger Wilco schrieb:

    Auch bei kleinen Sachen sollte man es lassen, weil man sich einfach gewisse Dinge dann angewöhnt und später automatisch so macht.

    Das ist wie bei den Code-Beispielen, die viel unsauberen Code beinhalten, weil es ja nur ein Beispiel sein soll. Damit rennen dann aber viele Anfänger gegen die Wand, weil die sich das abgucken.

    Ziemlich genau das wollte ich auch gerade schreiben 🙂


Anmelden zum Antworten