Simpelster Code funktioniert nicht so wie er soll



  • 4000$ schrieb:

    Programmieren lernt man durch programmieren und nicht durch langes nachdenken. Wie die Syntax einer Sprache richtig ist, lern man auch am besten, wenn man programmiert und Fehler macht.

    Programmieren und Syntax lernt man durch eine Kombination aus Lernen (Bücher, Tutorials [zu meiner Zeit hatten wir noch kein Modem, was damals auch sehr teuer gewesen wäre]) und Praxis (Programmieren). Der Mensch lernt am meisten, wenn er viele Quellen verwendet. Reines Ausprobieren hilft ebenso wenig wie reines Bücherlernen.

    4000$ schrieb:

    Ich glaub nicht, dass einer von den "Experten" hier ein paar Bücher gelesen, lang nachgedacht, alles verstanden und dann ohne Fehler los programmiert hat. 🙄

    Nein, aber ein Kapitel gelesen, versucht ob man es verstanden hat, und dann das nächste Kapitel gelesen. Ich rechne meine Fachbücher im IT bereich inzwischen auch eher in Metern (wobei ich neuerdings tendenziell in elektronischer Form meine Fachliteratur erwerbe, da die eh recht schnelllebig ist)...



  • Janjan schrieb:

    warum nur schrieb:

    asc schrieb:

    Spiel meinSpiel();
    

    Ist eine Funktionsdeklaration

    Warum haben die das so bescheuert gemacht? Gibt es irgendeinen Fall wo man eine Funktionsdeklaration in einer Funktion braucht?

    Möchtest du eine unterschiedliche Syntax in Funktionen und außerhalb?

    Wieso? Einfach nur keine Funktionsdeklaration in einer Funktion erlauben. Compileerror und jeder weiß, dass das kein Konstruktor Aufruf ist.



  • 4000$ schrieb:

    Programmieren lernt man durch programmieren und nicht durch langes nachdenken. Wie die Syntax einer Sprache richtig ist, lern man auch am besten, wenn man programmiert und Fehler macht

    Das stimmt, den Grossteil der Erfahrung sammelt man, indem man selbst programmiert. Dennoch ist dafür ein theoretisches Grundwissen erforderlich. Bevor man etwas anwenden kann, muss man es erst einmal kennen. Und sehr wohl muss man sich ab und zu Zeit nehmen, um etwas in Ruhe durchzudenken – als erfahrener Programmierer ebenso wie als Anfänger. Sowohl über Design und API als auch über konkrete Implementierungen.

    warum nur schrieb:

    Wieso? Einfach nur keine Funktionsdeklaration in einer Funktion erlauben. Compileerror und jeder weiß, dass das kein Konstruktor Aufruf ist.

    Warum sollte man keine lokale Funktionsdeklaration erlauben? Und wie will man hier konsistent bleiben? Denk dran, man kann Objekte auch global definieren, dann hätte man wieder das gleiche Problem.



  • Nexus schrieb:

    warum nur schrieb:

    Wieso? Einfach nur keine Funktionsdeklaration in einer Funktion erlauben. Compileerror und jeder weiß, dass das kein Konstruktor Aufruf ist.

    Warum sollte man keine lokale Funktionsdeklaration erlauben?

    Lokale Funktionsdefinitionen sind unzulässig. Wieso dann Funktionsdeklaration erlauben?

    Und wie will man hier konsistent bleiben? Denk dran, man kann Objekte auch global definieren, dann hätte man wieder das gleiche Problem.

    Nochmal. Wieso wollt ihr die Syntax ändern?



  • Weil es ein eher sinnloses Feature wäre was die Sprache aufbläht. Man erlaubt es nicht sondern man macht sich nicht die Mühe es zu verbieten.



  • 😃 Lies nochmal genau was ich schreibe.



  • warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig. Wieso dann Funktionsdeklaration erlauben?

    Weil man eine Funktion vielleicht nur innerhalb einer anderen Funktion und nicht in der ganzen Datei bekannt machen möchte.

    warum nur schrieb:

    Nochmal. Wieso wollt ihr die Syntax ändern?

    Was heisst hier ändern? Man macht es so, wie es für global deklarierte Objekte und für BuiltIn-Typen üblich ist. Das ist nichts als Konsistenz. Während dein Vorschlag das Gegenteil davon ist.

    Du willst also Folgendes:

    void Function()
    {
        MyClass var();
    }
    

    Aber bei anderen Typen schreibt man:

    void Function()
    {
        int var;
    }
    

    Und bei globalen Objekten schreibt man:

    namespace MyNamespace
    {
        MyClass var;
    }
    

    Und diese Sonderbehandlung nur, weil man als Anfänger ein einziges Mal darüber stolpert, dass MyClass var(); eine Funktionsdeklaration ist? Denkst du nicht, die Fallunterscheidung bei deinem Vorschlag würde noch viel mehr Leuten zu schaffen machen? Mal davon abgesehen, dass sie jegliche Generizität (z.B. T var; in Templates) verunmöglicht.



  • Nexus schrieb:

    warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig. Wieso dann Funktionsdeklaration erlauben?

    Weil man eine Funktion vielleicht nur innerhalb einer anderen Funktion und nicht in der ganzen Datei bekannt machen möchte.

    Hast du sowas schon jemals gebraucht? Und die Funktionsdefinitionen muss dann sowieso außerhalb sein, was ja total inkonsistent ist.

    warum nur schrieb:

    Nochmal. Wieso wollt ihr die Syntax ändern?

    Was heisst hier ändern? Man macht es so, wie es für global deklarierte Objekte und für BuiltIn-Typen üblich ist. Das ist nichts als Konsistenz. Während dein Vorschlag das Gegenteil davon ist.

    Du willst also Folgendes:
    ...

    Nein. Ihr redet von Syntax ändern. Ich frage: Wozu?

    Ich will nur lokale Funktionsdeklaration verbieten.


  • Administrator

    warum nur schrieb:

    Nein. Ihr redet von Syntax ändern. Ich frage: Wozu?

    Ich will nur lokale Funktionsdeklaration verbieten.

    Nexus hat nichts davon geredet, dass die Syntax verändert wird, sondern dass dein Lösungsvorschlag inkonsistent ist:

    // Bei globalen Variablen:
    MyClass object;
    
    // Wenn du bei globalen Variablen die Klammern hinmachst:
    MyClass object(); // <- Zack, Funktionsdekleration.
    
    int foo()
    {
      // Deshalb hat man hier:
      MyClass object;
      // Schön einheitlich zum Rest.
    
      // Wenn man hier plötzlich das hier darf:
      MyClass object();
      // Hat man eine Inkonsistenz zu den globalen Objekten, was noch viel verwirrender ist.
    }
    

    Jetzt verstanden? 🙂

    Grüssli



  • Schon lange verstanden, dass ihr es nicht versteht. Ich will nicht die Syntax für Konstruktoren ändern. Wozu auch? Ich will nur lokale Funktionsdeklaration verbieten.

    // Bei globalen Variablen: JA
    MyClass object;
    
    // Wenn du bei globalen Variablen die Klammern hinmachst:
    MyClass object(); // <- Zack, Funktionsdekleration. JA
    
    int foo()
    {
      // Deshalb hat man hier:
      MyClass object;
      // Schön einheitlich zum Rest. JA
    
      // Wenn man hier plötzlich das hier darf: DAS DARF MAN SCHON UND DAS IST MÜLL WEIL MAN JETZT EINE LOKALE FUNKTIONSDEKLARATION HAT WAS EIGENTLICH KEINER WILL
      MyClass object();  //ICH WILL HIER EINEN COMPILEERROR
    }
    

    Jetzt verstanden? 🙂


  • Mod

    warum nur schrieb:

    Ich will nur lokale Funktionsdeklaration verbieten.

    Warum?



  • Weil es dann ein unsinniges Konzept weniger gibt.



  • camper schrieb:

    warum nur schrieb:

    Ich will nur lokale Funktionsdeklaration verbieten.

    Warum?

    Wie oft noch? 🙄 Keiner braucht sie. Lokale Funktionsdefinitionen sind unzulässig, also bringen lokale Funktionsdeklaration sowieso nichts und sind nur inkonsistent.



  • warum nur schrieb:

    Wie oft noch? 🙄 Keiner braucht sie.

    Wie wärs mit einer Begründung? Es geht nicht nur darum, was du persönlich findest.

    warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig, also bringen lokale Funktionsdeklaration sowieso nichts

    Ziemlich kreative Schlussfolgerung.

    Ich habe ja schon erwähnt, wozu Funktionsdeklarationen innerhalb anderer Funktionen nützlich sein können. Wenn man grössere .cpp-Dateien hat, kann es von Vorteil sein, selten benutzte Funktionen nicht global zu deklarieren, damit der Zugriff beschränkt und lokal gehalten werden kann. In Headerdateien kannst du mit lokalen Funktionsdeklarationen verhindern, dass Funktionen plötzlich für alle einbindenden Dateien sichtbar werden.


  • Mod

    warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig, also bringen lokale Funktionsdeklaration sowieso nichts und sind nur inkonsistent.

    Also willst du eine Inkonsistenz durch eine andere ersetzen? Und überhaupt, ich möchte wenigstens ein Beispiel sehen, das durch die Abschaffung lokaler Funktionsdeklaration verbessert wird.



  • Nexus schrieb:

    warum nur schrieb:

    Wie oft noch? 🙄 Keiner braucht sie.

    Wie wärs mit einer Begründung? Es geht nicht nur darum, was du persönlich findest.

    Hmm, wir haben weit über 1 Millionen LOC. Ich hab noch nicht alle davon gesehen, aber schon ne ganze Menge und keine war ne lokale Funktionsdeklaration. Ich kann mich nicht erinnern in einem opensource Code eine gesehen zu haben. Keiner kann mir ein sinnvolles Beispiel zeigen. Deines ist es nicht wirklich, siehe unten.

    warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig, also bringen lokale Funktionsdeklaration sowieso nichts

    Ziemlich kreative Schlussfolgerung.

    Ich habe ja schon erwähnt, wozu Funktionsdeklarationen innerhalb anderer Funktionen nützlich sein können. Wenn man grössere .cpp-Dateien hat, kann es von Vorteil sein, selten benutzte Funktionen nicht global zu deklarieren, damit der Zugriff beschränkt und lokal gehalten werden kann.

    Und die Definition muss dann immer ganz unten sein, damit sie sonst keiner sieht, was ziemlich dämlich ist, weil es eben keine lokalen Funktionsdefinitionen gibt. Damit funktioniert es genau für eine Funktion richtig.

    In Headerdateien kannst du mit lokalen Funktionsdeklarationen verhindern, dass Funktionen plötzlich für alle einbindenden Dateien sichtbar werden.

    Das geht mit anonymen Namespaces viel schöner, in soeinem müsstest du sowieso die Definition verstecken.

    camper schrieb:

    warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig, also bringen lokale Funktionsdeklaration sowieso nichts und sind nur inkonsistent.

    Also willst du eine Inkonsistenz durch eine andere ersetzen?

    Welche andere?

    Und überhaupt, ich möchte wenigstens ein Beispiel sehen, das durch die Abschaffung lokaler Funktionsdeklaration verbessert wird.

    Siehe Threadanfang.



  • warum nur schrieb:

    camper schrieb:

    warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig, also bringen lokale Funktionsdeklaration sowieso nichts und sind nur inkonsistent.

    Also willst du eine Inkonsistenz durch eine andere ersetzen?

    Welche andere?

    Du liest nicht was die anderen schreiben, oder?



  • Janjan schrieb:

    warum nur schrieb:

    camper schrieb:

    warum nur schrieb:

    Lokale Funktionsdefinitionen sind unzulässig, also bringen lokale Funktionsdeklaration sowieso nichts und sind nur inkonsistent.

    Also willst du eine Inkonsistenz durch eine andere ersetzen?

    Welche andere?

    Du liest nicht was die anderen schreiben, oder?

    Sag was du meinst?



  • run.cpp

    #include <iostream>
    using namespace std;
    
    void run()
    {
        int x = 10;
        x++;
        cout << x << endl;
    }
    

    func.h

    void doIt() {
        void run();
        run();
    }
    

    main.cpp

    #include "func.h"
    
    int main() {
        doIt();
    }
    

    Hätte man einen Header "run.h" global in func.h includiert (oder doIt selber global deklariert), könnte man in main.cpp auch direkt auch run() aufrufen. Wenn du das nicht willst machst du eine lokale Funktionsdeklaration und gut ists. Und dein doIt() bleibt immer noch inline!



  • warum nur schrieb:

    Hmm, wir haben weit über 1 Millionen LOC. Ich hab noch nicht alle davon gesehen, aber schon ne ganze Menge und keine war ne lokale Funktionsdeklaration.

    Ich habe "keiner braucht sie" so verstanden, dass sie für niemanden einen Nutzen haben. Dass sie in der Realität nicht oft eingesetzt werden, glaube ich zwar gern, aber wie viel sagt dieser Sachverhalt über die Nützlichkeit eines Features aus? Es gibt einige Sprachmittel, die in der C++-Community keine grosse Bekanntheit geniessen, ohne gleich unnütz zu sein.

    warum nur schrieb:

    Und die Definition muss dann immer ganz unten sein, damit sie sonst keiner sieht, was ziemlich dämlich ist, weil es eben keine lokalen Funktionsdefinitionen gibt. Damit funktioniert es genau für eine Funktion richtig.

    Deine Aussage trifft nur auf Funktionen zu, die in der selben Übersetzungseinheit definiert werden.

    warum nur schrieb:

    Das geht mit anonymen Namespaces viel schöner, in soeinem müsstest du sowieso die Definition verstecken.

    Nein, müsste man wiederum nicht, wenn die Funktion in einem anderen Modul definiert ist. Anonyme Namensräume lösen das Problem der Sichtbarkeit nicht. Sie vermeiden in diesem Kontext nicht einmal Namenskonflikte.


Anmelden zum Antworten