Simpelster Code funktioniert nicht so wie er soll



  • 😃 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.



  • l'abra d'or schrieb:

    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!

    Und sowas machst du wirklich?

    Aber eigentlich ein gutes Beispiel warum man lokale Funktionsdeklaration verbieten sollte. Sie erzeugen nur total unübersichtlichen Code, weil so keiner weiß wo run definiert ist. Und run() ist immer noch genauso in main verfügbar.

    int main() {
        void run();
        run();
    }
    


  • Ich habe das auch noch nie gesehen und halte es auch für überflüssig. Ein Sprachfeature, welches von kaum jemandem benutzt wird sollte schon entfent werden, weil es sonst nur Balast ist und (wie hier) mehr Verwirrung, als Nutzen schafft. (Wie viele sind schon über genau diesen Fehler gestossen? - Ich bin mir nicht mehr sicher, wie die Compilermeldung aussieht, aber IIRC nicht sehr hilfreich)



  • drakon schrieb:

    Ich habe das auch noch nie gesehen und halte es auch für überflüssig. Ein Sprachfeature, welches von kaum jemandem benutzt wird sollte schon entfent werden, weil es sonst nur Balast ist und (wie hier) mehr Verwirrung, als Nutzen schafft. (Wie viele sind schon über genau diesen Fehler gestossen? - Ich bin mir nicht mehr sicher, wie die Compilermeldung aussieht, aber IIRC nicht sehr hilfreich)

    Sehe ich auch so. Wenn lokale Funktionsdefinitionen gingen, ja das wäre ein Spaß. Dann sollten auch lokale Funktionsdeklarationen gehen.
    Aber so isses Unfug.
    Nur weiß ich nicht, ob das Entfernen der lokalen Funktionddeklarationen jetzt im C++-Standard 20 Seiten mehr erzeugt oder 20 Seiten wegmacht. Auf jeden Fall bin ich für weniger Regeln oder mehr einfachere.



  • volkard schrieb:

    Nur weiß ich nicht, ob das Entfernen der lokalen Funktionddeklarationen jetzt im C++-Standard 20 Seiten mehr erzeugt oder 20 Seiten wegmacht. Auf jeden Fall bin ich für weniger Regeln oder mehr einfachere.

    Weisst du, was ich glaube? Das das kaum zu gross werden würde. Ein paar Zeilen würde ich mal vermuten, wo einfach gesagt wird, dass das nicht möglich ist. Fertig.



  • drakon schrieb:

    Ich bin mir nicht mehr sicher, wie die Compilermeldung aussieht, aber IIRC nicht sehr hilfreich

    Doch, ziemlich hilfreich. 🙂

    MSVC++ Ausgabe schrieb:

    'MyClass var(void)': Funktion mit Prototyp wurde nicht aufgerufen (war eine Variablendefinition gemeint?)


Anmelden zum Antworten