Wieso {}Blöcke mit ; schließen?



  • Hey,

    ich habe bis jetzt mit PHP gearbeitet, und dort musste man {}-Blöcke nicht mit einem Semikolon schließen,

    in C++ scheint das anders zu sein:

    struct artikel
      {
    
        int artNum;
        double artPreis;
    
      }; // <- dies hier
    

    Ist ja aber anscheinend auch nur in manchen Fällen so, was gibt es denn da für Unterschiede zwischen {}; und {}?

    Kann das jemand erläutern? 😉



  • Nach der Definition von Structs, Klassen, Enums, Unions (hab ich was vergessen?) kannst du jeweils bereits Variablen des Typs anlegen. Beispiel:

    struct foo
    {
        int bar
    } foo_instance; // foo_instance ist eine Variable vom Typ foo
    

    Damit der Compiler weiß, wann die Struct-Definition zuende ist, braucht er also das Semikolon.



  • Achso, quasi wie bei MySQL beim erstellen einer Tabelle, da kann man ja auch am Ende Parameter übergeben.

    Und was genau würde jetzt dein Code bewirken? (bezogen auf das foo_instance)



  • Max0r schrieb:

    ... Variablen des Typs anlegen. ...



  • Das ist aber sehr C-mässig. Das macht man üblicherweise in C++ nicht.

    @basi
    In C++ braucht es ein ';' nach jeder Definition. Sei es eine Variablendefinition oder aber auch Klassendefinitionen (nach Deklarationen ebenfalls und in vielen anderen Fällen auch).

    Nach Blöcken wird das Semikolon insbesondere nicht gebraucht bei Funktionsdefintionen und innerhalb von Funktionenen.

    void foo()
    {
      {
       int i;
      } // kein ;
    
    } // kein ;
    

    Erlaubt wäre es aber in beiden Fällen.

    Vom philosophischen Standpunkt aus gesehen wären gar keine Semikolons nötig, aber da das damals so definiert wurde musst du das halt einfach lernen (der Compiler hilft dir da stark dabei).



  • drakon schrieb:

    Vom philosophischen Standpunkt aus gesehen wären gar keine Semikolons nötig, aber da das damals so definiert wurde musst du das halt einfach lernen (der Compiler hilft dir da stark dabei).

    Das würde aber die Grammatik stark einschränken.



  • hustbaer schrieb:

    drakon schrieb:

    Vom philosophischen Standpunkt aus gesehen wären gar keine Semikolons nötig, aber da das damals so definiert wurde musst du das halt einfach lernen (der Compiler hilft dir da stark dabei).

    Das würde aber die Grammatik stark einschränken.

    Außerdem hat man es in C++ so gemacht und dann ist es gut.



  • drakon schrieb:

    void foo()
    {
      {
       int i;
      } // kein ;
    
    } // kein ;
    

    Erlaubt wäre es aber in beiden Fällen.

    Nein. Es gibt nur die leere Anweisung.

    ;
    

    Es gibt nicht die leere Deklaration.

    ;
    

    Also darf es eben nicht hinter die Funktion.



  • hustbaer schrieb:

    drakon schrieb:

    Vom philosophischen Standpunkt aus gesehen wären gar keine Semikolons nötig, aber da das damals so definiert wurde musst du das halt einfach lernen (der Compiler hilft dir da stark dabei).

    Das würde aber die Grammatik stark einschränken.

    Ich denke nicht so stark, wie man zuerst meint.
    Ich ziehe hier auch gern mal wieder Eiffel als Beispiel an, wo ich richtig erstaunt war wie wenig man Semikolons wirklich braucht. Und wenn man wirklich mal mehrere Anweisungen in einer Zeile haben will kann man trotzdem noch Semikolons einfügen, aber meistens ist das überhaupt nicht notwendig.
    Mir fällt im Moment auch kein wirklich realistisches Beispiel ein, wo man die Semikolons wirklich braucht (ich meine jetzt nicht die bei for Schleifen etc.)

    @666.22
    Nur weil es C++ vor x Jahren einmal gemacht hat heisst das gleich, dass es gut ist?!

    @volkard:
    Stimmt. Da habe ich nicht aufgepasst.



  • drakon schrieb:

    @666.22
    Nur weil es C++ vor x Jahren einmal gemacht hat heisst das gleich, dass es gut ist?!

    Nicht?? 😮



  • Ich weiss man sollte Trolle nicht füttern, aber hier haste nen Keks.



  • drakon schrieb:

    Ich weiss man sollte Trolle nicht füttern, aber hier haste nen Keks.

    Was ist das denn für ein unqualifizierter Kommentar?



  • basi schrieb:

    drakon schrieb:

    Ich weiss man sollte Trolle nicht füttern, aber hier haste nen Keks.

    Was ist das denn für ein unqualifizierter Kommentar?

    Dumme Fragen ergeben dumme Antworten und der letzte Kommentar von 666.22 (auch der erste) sind offensichtliche Trollversuche, auf welche man normalerweise nichteinmal eingeht.



  • drakon schrieb:

    In C++ braucht es ein ';' nach jeder Definition.

    Nicht nach jeder. Nach Funktions- oder Namensraumdefinitionen zum Beispiel nicht.



  • Nexus schrieb:

    drakon schrieb:

    In C++ braucht es ein ';' nach jeder Definition.

    Nicht nach jeder. Nach Funktions- oder Namensraumdefinitionen zum Beispiel nicht.

    Jaja, ich weiss. Ich wollte es ihm aber nicht zu kompliziert machen. 😉 (Die Funktionsdefinition habe ich ja noch als Ausnahme genannt und namespaces kommen eher selten vor).

    Ich denke Definitionen als Faustregel und den beiden gezeigten Ausnahmen und man hat einen Grossteil der Fälle abgedeckt. All die anderen Fälle muss man sich einfach merken. Wenn man es genau will, muss man fast den Standard zitieren, was einem Anfänger wohl kaum etwas bringt.



  • Schlage vor: Typedefinition.


Anmelden zum Antworten