Wutz erklärt C++ (Split aus: Frage zu extern)



  • Was soll dieser Thread darstellen?
    Selbstverarschung?


  • Mod

    hustbaer schrieb:

    Was soll dieser Thread darstellen?
    Selbstverarschung?

    Es ist ein Split. Hab vergessen es im Titel zu erwähnen.



  • OK verstehe 💡 🙂



  • Vielleicht sollte ich kurz erklären, wie ich überhaupt auf extern gekommen bin.

    Bisher hatte ich im Header immer einige Konstanten deklariert, wie zB Breite und Höhe des aktuellen Konsolenfenster. Habe nicht eingesehen, warum ich solche Werte, die sich prinzipbedingt im laufenden Programm gar nicht ändern können, (weshalb sollte sich plötzlich im laufenden Programm die Dimensionen der Konsole ändern?) durch das ganze Programm zu schleppen.

    Andererseits wurde immer von globalen Variablen abgeraten mit einer Vehemenz, wo ich dachte, das schließt dann auch Konstanten ein.

    Beim Lesen meines neulich bekommen 'Der C++ Programmierer' wurde dann in Kapitel 3.3 'modulare Programmgestaltung' static und extern eingeführt.

    Da ich auf globale Konstanten im Header nicht verzichten möchte, dachte ich fahrlässigerweise, mit dem Schlüsselwort extern kann ich den Makel von globalen Variablen irgendwie "übertünchen". In dem kleinen Unterkapitel 'One Definition Rule' wird dann kurz gezeigt, wie das aussehen muss. Deklaration im Header, Definition in der cpp mit der Bemerkung "nur einmal im Programm".

    Da mir das gegenüber dem einfachen const im Header trotzdem nicht richtig klar wurde, habe ich dann dieses Beispiel hier gezeigt, ob das überhaupt sinnvoll ist. Und wie gesagt, ich stehe noch ziemlich in den Grundlagen, weshalb manche Fragen etwas sonderbar erscheinen, weil ich den großen Zusammenhang noch nicht im Blick habe.


  • Mod

    Bisher hatte ich im Header immer einige Konstanten deklariert, wie zB Breite und Höhe des aktuellen Konsolenfenster.

    Was, wenn du plötzlich zwei Konsolenfenster anbieten möchtest? Den gesamten Code umschreiben?

    Andererseits wurde immer von globalen Variablen abgeraten mit einer Vehemenz, wo ich dachte, das schließt dann auch Konstanten ein.

    Nicht alle. Man muss eben ein Verständnis davon haben, was programmunabhängige Konstanten sind (bspw. Pi) und was einer "Instanz" des Programs angeheftet ist (bspw. irgendwelche Dateinamen oder Fensterdimensionen). Letztere sollten wahrscheinlich von der main aus heruntergereicht werden, während es für erstere nur Sinn macht, wenn die Konstante in den gegebenen Funktion nicht um ihrer selbst willen verwendet wird.



  • Was, wenn du plötzlich zwei Konsolenfenster anbieten möchtest? Den gesamten Code umschreiben?

    Ich schätze, das läuft wie using namepace std und std::endl . Anfänglich nimmt man eben das, was einem angeboten wird. Später, wenn man verstanden hat, was da läuft, macht man das anders.

    Im Moment wüsste ich jetzt gar nicht, wie man überhaupt mehrere Konsolenfenster erzeugen kann. Kann also gar nicht passieren. Wenn ich dann soweit wäre, wird sich auch mein Wissen und Stil erweitert haben. Im Moment sehe ich nicht ein, warum ich solche Werte das ganze Programm durch übergeben sollte.

    EDIT: Und falls man doch umschreiben möchte, ist es sicherlich einfacher, einige Werte im Header umzuschreiben, als überall in den Aufrufen.


  • Mod

    Im Moment sehe ich nicht ein, warum ich solche Werte das ganze Programm durch übergeben sollte.

    Weil Erweiterbarkeit/Wiederverwendbarkeit deines Codes davon abhängt. Und das sind essentielle Eigenschaften guten Stils.

    EDIT: Und falls man doch umschreiben möchte, ist es sicherlich einfacher, einige Werte im Header umzuschreiben, als überall in den Aufrufen.

    In den Aufrufen wirst du doch eine Variable angeben, die irgendwo einmal im Programm definiert ist. Bspw. in der main .



  • @lemon03 Wieso musst du in den Aufrufen etwas ändern, wenn sich ein Wert ändert?



  • Stimmt, habt beide recht, der Wert der Variable ändert sich natürlich nicht.

    Aber irgendwie widerstrebt es mir, solch "natürliche" Variablen wie in dem Fall die Dimensionen des Konsolenfensters an Funktionen, wo sie genutzt werden zu übergeben. Es gibt ja schon genug Werte, die übergeben werden müssen.

    Mir fiele nur ein, die Werte dann direkt in den Funktionen zu deklarieren, wo man dann aber bei Änderung wieder mit suchen und ersetzen beschäftigt wäre.



  • lemon03 schrieb:

    Aber irgendwie widerstrebt es mir, solch "natürliche" Variablen wie in dem Fall die Dimensionen des Konsolenfensters an Funktionen, wo sie genutzt werden zu übergeben. Es gibt ja schon genug Werte, die übergeben werden müssen.

    Anstelle von:

    void f(int,int,int,int,int,int,int,int,int)
    

    Kannst Du es doch auch so lösen:

    struct Cfg {
      int a, b, c, d, e, f, g, h, i, j, k, l, m, n;
    }
    
    void f(const Cfg&);
    

    Falls Dich die Anzahl an Übergabeparameter stören sollten.



  • Das wäre in einem anderen Fall bei mir tatsächlich interessant, danke dafür.

    Ansonsten werde ich mal über die ganze Sache weiter nachdenken ...



  • Ich hab mir von dem Thread ein bisschen mehr erhofft...



  • Mehr zu welchem Thema?



  • Der Thread heißt ja "Wutz erklärt C++", also dachte ich, dass er hier tatsächlich mal ausnahmsweise etwas erklärt, statt nur festzustellen, dass alle anderen keine Ahnung haben. z.B. das Theman mit den unions. Aber hier gibts ja auch keine einzige Erklärung von ihm.



  • Naja, den Titel hat ja Arcoth vergeben. Ich hatte es ursprünglich (bevor Arcoth das "(Split aus: Frage zu extern)" dazueditiert hat) auch nicht gecheckt.


Anmelden zum Antworten